Repository: ufcpp/UfcppSample Branch: master Commit: 4d73d5ef42d6 Files: 3510 Total size: 9.6 MB Directory structure: gitextract_06k9nztl/ ├── .editorconfig ├── .gitattributes ├── .github/ │ └── FUNDING.yml ├── .gitignore ├── BreakingChanges/ │ ├── .gitignore │ ├── BreakingChanges.sln │ ├── VS2008_CS3/ │ │ ├── OverloadResolutionArraysOfPointer.cs │ │ ├── ParamsOverride.cs │ │ └── VS2008_CS3.csproj │ ├── VS2010_CS4/ │ │ ├── ImplicitConversionCausedByVariance.cs │ │ └── VS2010_CS4.csproj │ ├── VS2012_CS5/ │ │ ├── IterationVariableOfForeach.cs │ │ └── VS2012_CS5.csproj │ ├── VS2015_CS6/ │ │ ├── CyclicalConstructorChaining.cs │ │ ├── DefiniteAssignment.cs │ │ ├── EnumBaseTypeSystemInt32.cs │ │ ├── FuncOfFuncTypeInference.cs │ │ ├── InvariantMeaningInBlock.cs │ │ ├── KatakanaMiddleDot.cs │ │ └── VS2015_CS6.csproj │ ├── a.cs │ ├── csc-all.ps1 │ ├── csc.ps1 │ └── read-summary.ps1 ├── Chapters/ │ ├── Algorithm/ │ │ ├── Algorithm.csproj │ │ ├── Algorithm.sln │ │ ├── App.config │ │ ├── Collections/ │ │ │ ├── ArrayList.cs │ │ │ ├── BinaryTree.cs │ │ │ ├── CircularBuffer.cs │ │ │ ├── Dictionary.cs │ │ │ ├── ForwardLinkedList.cs │ │ │ ├── HashTable.cs │ │ │ ├── LinkedList.cs │ │ │ ├── PriorityQueue.cs │ │ │ ├── Queue.cs │ │ │ ├── Set.cs │ │ │ ├── SortedArray.cs │ │ │ └── Stack.cs │ │ ├── Program.cs │ │ └── Sort/ │ │ ├── BubbleSort.cs │ │ ├── BucketSort.cs │ │ ├── HeapSort.cs │ │ ├── InsertSort.cs │ │ ├── MergeSort.cs │ │ ├── QuickSort.cs │ │ ├── RadixSort.cs │ │ ├── SelectSort.cs │ │ ├── ShellSort.cs │ │ └── Sort.cs │ ├── AllInOne.sln │ ├── Async/ │ │ ├── Async.sln │ │ ├── Lock/ │ │ │ ├── Lock.csproj │ │ │ ├── Monitor.cs │ │ │ └── Program.cs │ │ └── TaskLike/ │ │ ├── Program.cs │ │ ├── TaskLike.cs │ │ └── TaskLike.csproj │ ├── Blogs/ │ │ ├── 2017/ │ │ │ └── Rune.pptx │ │ ├── UnityAsync/ │ │ │ ├── UnityAsync0Introduction.md │ │ │ ├── UnityAsync1Background.md │ │ │ ├── UnityAsync2CurrentStatus.md │ │ │ ├── UnityAsync3Retrospective.md │ │ │ └── await fig.pptx │ │ └── misc/ │ │ └── StructuralTyping.pptx │ ├── Data/ │ │ ├── DataTypes.sln │ │ ├── Deconstruction/ │ │ │ ├── DeconstructMethod.cs │ │ │ ├── Deconstruction.csproj │ │ │ ├── Evaluation.cs │ │ │ ├── Extensions.cs │ │ │ ├── Program.cs │ │ │ ├── Summary.cs │ │ │ ├── Vector2D.cs │ │ │ └── Vector3D.cs │ │ ├── Discards/ │ │ │ ├── Discards.csproj │ │ │ └── Program.cs │ │ ├── OutVar/ │ │ │ ├── OutVar.csproj │ │ │ ├── Point.cs │ │ │ └── Program.cs │ │ ├── Patterns/ │ │ │ ├── CallOnce.cs │ │ │ ├── ConstantPattern.cs │ │ │ ├── DeconstructRemoval.cs │ │ │ ├── DiscardPattern.cs │ │ │ ├── Expressions/ │ │ │ │ ├── Node.cs │ │ │ │ └── Program.cs │ │ │ ├── Line.cs │ │ │ ├── NoOrderGarantee.cs │ │ │ ├── NonNull.cs │ │ │ ├── Patterns.csproj │ │ │ ├── Point.cs │ │ │ ├── PositionalPattern.cs │ │ │ ├── PropertyPattern.cs │ │ │ ├── PropertyPatternField.cs │ │ │ ├── RecursivePattern.cs │ │ │ ├── Tuple.cs │ │ │ ├── TupleSwitch.cs │ │ │ ├── TypePattern.cs │ │ │ ├── TypePatternNull.cs │ │ │ ├── UserDefinedOperator.cs │ │ │ ├── VarPattern.cs │ │ │ └── ZeroOneTuple.cs │ │ ├── Tuples/ │ │ │ ├── ErroneousSamples.cs │ │ │ ├── Implementation.cs │ │ │ ├── OutParams.cs │ │ │ ├── Overload.cs │ │ │ ├── Program.cs │ │ │ ├── Summary.cs │ │ │ ├── Tuples.csproj │ │ │ ├── ValueTuple.cs │ │ │ └── ZipSample.cs │ │ ├── TypeSwitch/ │ │ │ ├── Expressions/ │ │ │ │ ├── Calculate.switcha.cs │ │ │ │ ├── Calculate.vritual.cs │ │ │ │ ├── Node.cs │ │ │ │ ├── NodeBuilder.cs │ │ │ │ ├── Program.cs │ │ │ │ └── ToString.cs │ │ │ ├── IsSample.cs │ │ │ ├── Program.cs │ │ │ ├── Summary.cs │ │ │ ├── SwitchPerformance.cs │ │ │ ├── SwitchSample.cs │ │ │ ├── TypeSwitch.csproj │ │ │ └── TypeSwitchPerformance.cs │ │ └── fig/ │ │ └── fig typeswitch.pptx │ ├── DevEnv/ │ │ ├── CodeAwareLibrarySample/ │ │ │ ├── .gitignore │ │ │ ├── CodeAwareLibrarySample.sln │ │ │ ├── FluentArithmetic/ │ │ │ │ ├── FluentArithmetic.csproj │ │ │ │ ├── FluentExtensions.cs │ │ │ │ ├── Properties/ │ │ │ │ │ └── AssemblyInfo.cs │ │ │ │ └── project.json │ │ │ ├── FluentArithmeticAnalyzer/ │ │ │ │ ├── FluentArithmeticAnalyzer/ │ │ │ │ │ ├── Assembly.cs │ │ │ │ │ ├── DivByZero/ │ │ │ │ │ │ └── DivByZeroAnalyzer.cs │ │ │ │ │ ├── FluentArithmeticAnalyzer.csproj │ │ │ │ │ ├── Literal/ │ │ │ │ │ │ ├── LiteralAnalyzer.cs │ │ │ │ │ │ └── LiteralFix.cs │ │ │ │ │ ├── Properties/ │ │ │ │ │ │ └── AssemblyInfo.cs │ │ │ │ │ ├── Resources.Designer.cs │ │ │ │ │ ├── Resources.resx │ │ │ │ │ ├── SyntaxExtensions.cs │ │ │ │ │ └── project.json │ │ │ │ ├── FluentArithmeticAnalyzer.Test/ │ │ │ │ │ ├── DivByZeroUnitTest.cs │ │ │ │ │ ├── FluentArithmeticAnalyzer.Test.csproj │ │ │ │ │ ├── Helpers/ │ │ │ │ │ │ ├── CodeFixVerifier.Helper.cs │ │ │ │ │ │ ├── DiagnosticResult.cs │ │ │ │ │ │ └── DiagnosticVerifier.Helper.cs │ │ │ │ │ ├── LiteralUnitTest.cs │ │ │ │ │ ├── Properties/ │ │ │ │ │ │ └── AssemblyInfo.cs │ │ │ │ │ ├── Verifiers/ │ │ │ │ │ │ ├── CodeFixVerifier.cs │ │ │ │ │ │ └── DiagnosticVerifier.cs │ │ │ │ │ ├── app.config │ │ │ │ │ └── packages.config │ │ │ │ └── FluentArithmeticAnalyzer.Vsix/ │ │ │ │ ├── FluentArithmeticAnalyzer.Vsix.csproj │ │ │ │ └── source.extension.vsixmanifest │ │ │ └── build/ │ │ │ ├── FluentArithmetic.nuspec │ │ │ ├── build.ps1 │ │ │ └── pack.bat │ │ ├── ConsoleApplication1/ │ │ │ ├── ConsoleApplication1/ │ │ │ │ ├── App.config │ │ │ │ ├── ConsoleApplication1.csproj │ │ │ │ ├── Logic.cs │ │ │ │ ├── Program.cs │ │ │ │ └── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ └── ConsoleApplication1.sln │ │ ├── Dependency/ │ │ │ ├── Game/ │ │ │ │ ├── App/ │ │ │ │ │ ├── App.csproj │ │ │ │ │ ├── App.xaml │ │ │ │ │ ├── App.xaml.cs │ │ │ │ │ ├── ApplicationInsights.config │ │ │ │ │ ├── MainPage.xaml │ │ │ │ │ ├── MainPage.xaml.cs │ │ │ │ │ ├── Package.appxmanifest │ │ │ │ │ ├── Properties/ │ │ │ │ │ │ ├── AssemblyInfo.cs │ │ │ │ │ │ └── Default.rd.xml │ │ │ │ │ └── packages.config │ │ │ │ ├── ClassLibrary/ │ │ │ │ │ ├── ClassLibrary.csproj │ │ │ │ │ ├── Game.cs │ │ │ │ │ └── Properties/ │ │ │ │ │ └── AssemblyInfo.cs │ │ │ │ ├── ConsoleApplication/ │ │ │ │ │ ├── App.config │ │ │ │ │ ├── ConsoleApplication.csproj │ │ │ │ │ ├── Program.cs │ │ │ │ │ └── Properties/ │ │ │ │ │ └── AssemblyInfo.cs │ │ │ │ ├── Game.sln │ │ │ │ ├── WebApplication/ │ │ │ │ │ ├── App_Start/ │ │ │ │ │ │ ├── BundleConfig.cs │ │ │ │ │ │ ├── FilterConfig.cs │ │ │ │ │ │ ├── IdentityConfig.cs │ │ │ │ │ │ ├── RouteConfig.cs │ │ │ │ │ │ └── Startup.Auth.cs │ │ │ │ │ ├── Content/ │ │ │ │ │ │ ├── Site.css │ │ │ │ │ │ └── bootstrap.css │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ ├── AccountController.cs │ │ │ │ │ │ ├── HomeController.cs │ │ │ │ │ │ └── ManageController.cs │ │ │ │ │ ├── Global.asax │ │ │ │ │ ├── Global.asax.cs │ │ │ │ │ ├── Models/ │ │ │ │ │ │ ├── AccountViewModels.cs │ │ │ │ │ │ ├── IdentityModels.cs │ │ │ │ │ │ └── ManageViewModels.cs │ │ │ │ │ ├── Project_Readme.html │ │ │ │ │ ├── Properties/ │ │ │ │ │ │ └── AssemblyInfo.cs │ │ │ │ │ ├── Scripts/ │ │ │ │ │ │ ├── _references.js │ │ │ │ │ │ ├── bootstrap.js │ │ │ │ │ │ ├── jquery-1.10.2.intellisense.js │ │ │ │ │ │ ├── jquery-1.10.2.js │ │ │ │ │ │ ├── jquery.validate-vsdoc.js │ │ │ │ │ │ ├── jquery.validate.js │ │ │ │ │ │ ├── jquery.validate.unobtrusive.js │ │ │ │ │ │ ├── modernizr-2.6.2.js │ │ │ │ │ │ └── respond.js │ │ │ │ │ ├── Startup.cs │ │ │ │ │ ├── Views/ │ │ │ │ │ │ ├── Account/ │ │ │ │ │ │ │ ├── ConfirmEmail.cshtml │ │ │ │ │ │ │ ├── ExternalLoginConfirmation.cshtml │ │ │ │ │ │ │ ├── ExternalLoginFailure.cshtml │ │ │ │ │ │ │ ├── ForgotPassword.cshtml │ │ │ │ │ │ │ ├── ForgotPasswordConfirmation.cshtml │ │ │ │ │ │ │ ├── Login.cshtml │ │ │ │ │ │ │ ├── Register.cshtml │ │ │ │ │ │ │ ├── ResetPassword.cshtml │ │ │ │ │ │ │ ├── ResetPasswordConfirmation.cshtml │ │ │ │ │ │ │ ├── SendCode.cshtml │ │ │ │ │ │ │ ├── VerifyCode.cshtml │ │ │ │ │ │ │ └── _ExternalLoginsListPartial.cshtml │ │ │ │ │ │ ├── Home/ │ │ │ │ │ │ │ ├── About.cshtml │ │ │ │ │ │ │ ├── Contact.cshtml │ │ │ │ │ │ │ └── Index.cshtml │ │ │ │ │ │ ├── Manage/ │ │ │ │ │ │ │ ├── AddPhoneNumber.cshtml │ │ │ │ │ │ │ ├── ChangePassword.cshtml │ │ │ │ │ │ │ ├── Index.cshtml │ │ │ │ │ │ │ ├── ManageLogins.cshtml │ │ │ │ │ │ │ ├── SetPassword.cshtml │ │ │ │ │ │ │ └── VerifyPhoneNumber.cshtml │ │ │ │ │ │ ├── Shared/ │ │ │ │ │ │ │ ├── Error.cshtml │ │ │ │ │ │ │ ├── Lockout.cshtml │ │ │ │ │ │ │ ├── _Layout.cshtml │ │ │ │ │ │ │ └── _LoginPartial.cshtml │ │ │ │ │ │ ├── Web.config │ │ │ │ │ │ └── _ViewStart.cshtml │ │ │ │ │ ├── Web.Debug.config │ │ │ │ │ ├── Web.Release.config │ │ │ │ │ ├── Web.config │ │ │ │ │ ├── WebApplication.csproj │ │ │ │ │ └── packages.config │ │ │ │ └── WpfApplication/ │ │ │ │ ├── App.config │ │ │ │ ├── App.xaml │ │ │ │ ├── App.xaml.cs │ │ │ │ ├── MainWindow.xaml │ │ │ │ ├── MainWindow.xaml.cs │ │ │ │ ├── Properties/ │ │ │ │ │ ├── AssemblyInfo.cs │ │ │ │ │ ├── Resources.Designer.cs │ │ │ │ │ ├── Resources.resx │ │ │ │ │ ├── Settings.Designer.cs │ │ │ │ │ └── Settings.settings │ │ │ │ └── WpfApplication.csproj │ │ │ └── GameFramework/ │ │ │ ├── Game.Android/ │ │ │ │ ├── Class1.cs │ │ │ │ ├── Game.Android.csproj │ │ │ │ ├── Properties/ │ │ │ │ │ └── AssemblyInfo.cs │ │ │ │ └── Resources/ │ │ │ │ ├── AboutResources.txt │ │ │ │ ├── Resource.Designer.cs │ │ │ │ └── Values/ │ │ │ │ └── Strings.xml │ │ │ ├── Game.Core/ │ │ │ │ ├── Game.Core.csproj │ │ │ │ ├── Game.cs │ │ │ │ └── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── Game.Desktop/ │ │ │ │ ├── Class1.cs │ │ │ │ ├── Game.Desktop.csproj │ │ │ │ └── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── Game.Ios/ │ │ │ │ ├── Class1.cs │ │ │ │ ├── Game.Ios.csproj │ │ │ │ └── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── Game.Server/ │ │ │ │ ├── Class1.cs │ │ │ │ ├── Game.Server.csproj │ │ │ │ └── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── Game.Universal/ │ │ │ │ ├── Class1.cs │ │ │ │ ├── Game.Universal.csproj │ │ │ │ ├── Properties/ │ │ │ │ │ └── AssemblyInfo.cs │ │ │ │ └── packages.config │ │ │ └── GameFramework.sln │ │ ├── fig/ │ │ │ └── devenv.pptx │ │ └── アプリ1/ │ │ ├── アプリ1/ │ │ │ ├── App.xaml │ │ │ ├── App.xaml.cs │ │ │ ├── ApplicationInsights.config │ │ │ ├── MainPage.xaml │ │ │ ├── MainPage.xaml.cs │ │ │ ├── Package.appxmanifest │ │ │ ├── Properties/ │ │ │ │ ├── AssemblyInfo.cs │ │ │ │ └── Default.rd.xml │ │ │ ├── packages.config │ │ │ └── アプリ1.csproj │ │ ├── アプリ1.sln │ │ ├── 共通部品/ │ │ │ ├── Class1.cs │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ └── 共通部品.csproj │ │ ├── 社内ツール1/ │ │ │ ├── App.config │ │ │ ├── App.xaml │ │ │ ├── App.xaml.cs │ │ │ ├── MainWindow.xaml │ │ │ ├── MainWindow.xaml.cs │ │ │ ├── Properties/ │ │ │ │ ├── AssemblyInfo.cs │ │ │ │ ├── Resources.Designer.cs │ │ │ │ ├── Resources.resx │ │ │ │ ├── Settings.Designer.cs │ │ │ │ └── Settings.settings │ │ │ └── 社内ツール1.csproj │ │ └── 社内ツール2/ │ │ ├── App.config │ │ ├── Program.cs │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ └── 社内ツール2.csproj │ ├── Dynamic/ │ │ └── fig/ │ │ └── ExpressionTrees.pptx │ ├── Event/ │ │ ├── Event.sln │ │ ├── EventDriven/ │ │ │ ├── EventDriven.csproj │ │ │ ├── Program.cs │ │ │ ├── Version1/ │ │ │ │ └── Program.cs │ │ │ ├── Version2/ │ │ │ │ ├── KeyboardEventLoop.cs │ │ │ │ └── Program.cs │ │ │ └── Version3/ │ │ │ ├── KeyboardEventLoop.cs │ │ │ └── Program.cs │ │ ├── Observable/ │ │ │ ├── AnonymousFunction.cs │ │ │ ├── EventInternal/ │ │ │ │ ├── Cshap4/ │ │ │ │ │ └── EventSample.cs │ │ │ │ ├── Csharp1/ │ │ │ │ │ └── EventSample.cs │ │ │ │ └── EventSample.cs │ │ │ ├── EventSource.cs │ │ │ ├── Observable.csproj │ │ │ ├── ParameterProbrem.cs │ │ │ ├── Program.cs │ │ │ └── ReactiveExtensions.cs │ │ └── fig/ │ │ └── event.pptx │ ├── FileBaseApp/ │ │ ├── AllowUnsafeBlocks.cs │ │ ├── AspNet.cs │ │ ├── Cat.cs │ │ ├── Csproj/ │ │ │ ├── Csproj.csproj │ │ │ └── Program.cs │ │ ├── InvariantGlobalization.cs │ │ ├── Lib/ │ │ │ ├── Lib.csproj │ │ │ └── Program.cs │ │ ├── PackageReference.cs │ │ ├── ProjectReference.cs │ │ └── Shebang.cs │ ├── Framework/ │ │ └── fig/ │ │ ├── Framework.pptx │ │ └── JIT.pptx │ ├── Functional/ │ │ ├── DelegateInternal/ │ │ │ ├── DelegateInternal.csproj │ │ │ ├── F.cs │ │ │ ├── GetLength.cs │ │ │ ├── InstanceMethod.cs │ │ │ ├── LambdaOptimization.cs │ │ │ ├── MakePrimitiveContravariant.cs │ │ │ ├── MakePrimitiveCovariant.cs │ │ │ └── Program.cs │ │ ├── ExtensionMethods/ │ │ │ ├── ExtensionMethods.csproj │ │ │ ├── Instance.cs │ │ │ ├── InstanceAndExtension.cs │ │ │ └── MyApp.cs │ │ ├── Functional.sln │ │ ├── LambdaInternal/ │ │ │ ├── InSameBoat.cs │ │ │ ├── InstanceMethod.cs │ │ │ ├── LambdaInternal.csproj │ │ │ ├── MultipleFunctions.cs │ │ │ ├── Program.cs │ │ │ └── StaticMethod.cs │ │ └── LocalFunctions/ │ │ ├── Capture.cs │ │ ├── CaptureOptimization.cs │ │ ├── CaptureOverwrite.cs │ │ ├── Factorial.cs │ │ ├── Iterator/ │ │ │ ├── MyEnumerable1.cs │ │ │ ├── MyEnumerable2.cs │ │ │ ├── MyEnumerable3.cs │ │ │ ├── Program1.cs │ │ │ └── Program2.cs │ │ ├── Lambda.cs │ │ ├── LocalFunctions.csproj │ │ ├── Program.cs │ │ ├── RecursiveFunction/ │ │ │ ├── Node.cs │ │ │ ├── Program.cs │ │ │ └── Tree.cs │ │ ├── TaskCache/ │ │ │ ├── Program1.cs │ │ │ └── Program2.cs │ │ ├── ToArray/ │ │ │ ├── Program1.cs │ │ │ └── Program2.cs │ │ └── Usage/ │ │ └── Usage.cs │ ├── Interop/ │ │ ├── NativeInterop/ │ │ │ ├── .gitignore │ │ │ ├── Com/ │ │ │ │ ├── ComImportSample.cs │ │ │ │ └── ComLateBindingSample.cs │ │ │ ├── Dll/ │ │ │ │ ├── BlittableSample1.cs │ │ │ │ ├── BlittableSample2.cs │ │ │ │ ├── CallbackSample.cs │ │ │ │ ├── DllImportSample.cs │ │ │ │ ├── StringSample.cs │ │ │ │ └── YourOwnDllImport.cs │ │ │ ├── NativeInterop.csproj │ │ │ ├── NativeInterop.sln │ │ │ ├── Program.cs │ │ │ ├── Sample.xml │ │ │ └── WinRt/ │ │ │ └── WinRtSample.cs │ │ ├── NativeMemory/ │ │ │ ├── ManagedApp/ │ │ │ │ ├── Interop.cs │ │ │ │ ├── ManagedApp.csproj │ │ │ │ └── Program.cs │ │ │ ├── NativeLib/ │ │ │ │ ├── NativeLib.cpp │ │ │ │ ├── NativeLib.vcxproj │ │ │ │ ├── NativeLib.vcxproj.filters │ │ │ │ ├── ReadMe.txt │ │ │ │ ├── dllmain.cpp │ │ │ │ ├── stdafx.cpp │ │ │ │ ├── stdafx.h │ │ │ │ └── targetver.h │ │ │ └── NativeMemory.sln │ │ ├── TypedReference/ │ │ │ ├── ArgList/ │ │ │ │ └── Program.cs │ │ │ ├── CppReference/ │ │ │ │ ├── CppReference.cpp │ │ │ │ ├── CppReference.vcxproj │ │ │ │ ├── CppReference.vcxproj.filters │ │ │ │ ├── stdafx.cpp │ │ │ │ ├── stdafx.h │ │ │ │ └── targetver.h │ │ │ ├── ImplicitReference/ │ │ │ │ └── Program.cs │ │ │ ├── InteropArgList/ │ │ │ │ └── Program.cs │ │ │ ├── MakeRef/ │ │ │ │ └── Program.cs │ │ │ ├── Program.cs │ │ │ ├── Readme.md │ │ │ ├── ReferenceUsage/ │ │ │ │ └── Program.cs │ │ │ ├── TypedReference.csproj │ │ │ └── TypedReference.sln │ │ ├── Unsafe/ │ │ │ ├── Unsafe/ │ │ │ │ ├── Array.cs │ │ │ │ ├── CustomFixed.cs │ │ │ │ ├── EmptyArray.cs │ │ │ │ ├── GcTracking.cs │ │ │ │ ├── MutateString.cs │ │ │ │ ├── PointerOperators.cs │ │ │ │ ├── Program.cs │ │ │ │ ├── RewriteString.cs │ │ │ │ ├── String.Copy.cs │ │ │ │ ├── String.cs │ │ │ │ ├── StringInternal.cs │ │ │ │ └── Unsafe.csproj │ │ │ └── Unsafe.sln │ │ ├── Win32Dll/ │ │ │ ├── ReadMe.txt │ │ │ ├── Win32Dll.cpp │ │ │ ├── Win32Dll.vcxproj │ │ │ ├── Win32Dll.vcxproj.filters │ │ │ ├── dllmain.cpp │ │ │ ├── stdafx.cpp │ │ │ ├── stdafx.h │ │ │ └── targetver.h │ │ └── fig/ │ │ └── unsafe.pptx │ ├── MemoryManagement/ │ │ ├── DefaultValue/ │ │ │ ├── ArrayInitialization.cs │ │ │ ├── DefaultValue.csproj │ │ │ ├── FieldInitialization.cs │ │ │ ├── Point.cs │ │ │ └── Program.cs │ │ ├── MemoryManagement.sln │ │ ├── UninitializedMemory/ │ │ │ ├── ReadMe.txt │ │ │ ├── UninitializedMemory.cpp │ │ │ ├── UninitializedMemory.vcxproj │ │ │ ├── UninitializedMemory.vcxproj.filters │ │ │ ├── stdafx.cpp │ │ │ ├── stdafx.h │ │ │ └── targetver.h │ │ └── fig/ │ │ └── fig immutable.pptx │ ├── Misc/ │ │ ├── Keywords/ │ │ │ ├── Await/ │ │ │ │ ├── async.cs │ │ │ │ ├── await.cs │ │ │ │ └── yield.cs │ │ │ ├── Keywords.csproj │ │ │ ├── NameOf/ │ │ │ │ ├── NameOf.cs │ │ │ │ └── UsingStatic.cs │ │ │ ├── Program.cs │ │ │ ├── Var/ │ │ │ │ ├── Variance.cs │ │ │ │ └── var.cs │ │ │ └── Yield/ │ │ │ ├── Program.cs │ │ │ └── cs1.cs │ │ ├── Misc.sln │ │ └── PatternBased/ │ │ ├── CollectionInitializer.cs │ │ ├── DeconstructBenchmark.cs │ │ ├── PatternBased.csproj │ │ ├── Queryable1.cs │ │ ├── Queryable12.cs │ │ └── Using.cs │ ├── NullableReferenceTypes/ │ │ ├── DefiniteAssignment/ │ │ │ ├── DefiniteAssignment.csproj │ │ │ └── Program.cs │ │ ├── FlowAnalysis/ │ │ │ ├── Assingment.cs │ │ │ ├── Attributes.cs │ │ │ ├── BclAnnotation.cs │ │ │ ├── Default.cs │ │ │ ├── Equality.cs │ │ │ ├── FlowAnalysis.csproj │ │ │ ├── Forgiving.cs │ │ │ └── Generics.cs │ │ ├── NullPointer/ │ │ │ ├── InvalidPointer.cs │ │ │ ├── ManualNullCheck/ │ │ │ │ ├── CallHierarchy.cs │ │ │ │ └── DuplicateNullCheck.cs │ │ │ └── NullPointer.csproj │ │ ├── NullableReferenceTypes.sln │ │ ├── ProjectLevel/ │ │ │ ├── Annotations/ │ │ │ │ └── Annotations.csproj │ │ │ ├── Disable/ │ │ │ │ └── Disable.csproj │ │ │ ├── Enable/ │ │ │ │ └── Enable.csproj │ │ │ ├── Nullability.cs │ │ │ └── Warnings/ │ │ │ └── Warnings.csproj │ │ └── SourceLevel/ │ │ ├── IntParse.cs │ │ ├── Program.cs │ │ └── SourceLevel.csproj │ ├── Old/ │ │ ├── ApplyXsl/ │ │ │ ├── ApplyXsl.cs │ │ │ └── readme.txt │ │ ├── BitField/ │ │ │ ├── AssemblyInfo.cs │ │ │ ├── BitField.cs │ │ │ ├── BitField.csproj │ │ │ ├── BitField.sln │ │ │ ├── BitField.xml │ │ │ ├── SampleLogic.cs │ │ │ ├── readme.html │ │ │ └── test.cs │ │ ├── Complex/ │ │ │ ├── AssemblyInfo.cs │ │ │ ├── CartesianComplex.cs │ │ │ ├── Complex.cs │ │ │ ├── PolarComplex.cs │ │ │ ├── makefile │ │ │ ├── readme.txt │ │ │ └── test.cs │ │ ├── DrawImage/ │ │ │ ├── DrawImage.csproj │ │ │ ├── Form1.Designer.cs │ │ │ ├── Form1.cs │ │ │ ├── Form1.resx │ │ │ ├── Program.cs │ │ │ └── Properties/ │ │ │ ├── AssemblyInfo.cs │ │ │ ├── Resources.Designer.cs │ │ │ ├── Resources.resx │ │ │ ├── Settings.Designer.cs │ │ │ └── Settings.settings │ │ ├── KeyLogger/ │ │ │ ├── Gma.UserActivityMonitor/ │ │ │ │ ├── AssemblyInfo.cs │ │ │ │ ├── GlobalEventProvider.cs │ │ │ │ ├── Gma.UserActivityMonitor.csproj │ │ │ │ ├── HookManager.Callbacks.cs │ │ │ │ ├── HookManager.Structures.cs │ │ │ │ ├── HookManager.Windows.cs │ │ │ │ ├── HookManager.cs │ │ │ │ └── MouseEventExtArgs.cs │ │ │ ├── KeyLogger/ │ │ │ │ ├── App.xaml │ │ │ │ ├── App.xaml.cs │ │ │ │ ├── KeyLogger.csproj │ │ │ │ ├── NativeWin32.cs │ │ │ │ ├── Properties/ │ │ │ │ │ ├── AssemblyInfo.cs │ │ │ │ │ ├── Resources.Designer.cs │ │ │ │ │ ├── Resources.resx │ │ │ │ │ ├── Settings.Designer.cs │ │ │ │ │ └── Settings.settings │ │ │ │ ├── Window1.xaml │ │ │ │ └── Window1.xaml.cs │ │ │ └── KeyLogger.sln │ │ ├── LineArt/ │ │ │ ├── AssemblyInfo.cs │ │ │ ├── Form1.cs │ │ │ ├── Form1.resx │ │ │ ├── LineArt.csproj │ │ │ ├── LineArt.sln │ │ │ ├── SettingForm.cs │ │ │ └── SettingForm.resx │ │ ├── SoundLibrary/ │ │ │ ├── AssemblyInfo.cs │ │ │ ├── BitOperation.cs │ │ │ ├── Command/ │ │ │ │ └── CommandParser.cs │ │ │ ├── Data/ │ │ │ │ ├── DataGenerator.cs │ │ │ │ ├── FourierSeriesGenerator.cs │ │ │ │ ├── ImpulseGenerator.cs │ │ │ │ ├── MixedDataGenerator.cs │ │ │ │ ├── RampGenerator.cs │ │ │ │ ├── RandomGenerator.cs │ │ │ │ ├── SinusoidGenerator.cs │ │ │ │ ├── StepGenerator.cs │ │ │ │ ├── TspGenerator.cs │ │ │ │ └── WhiteNoiseGenerator.cs │ │ │ ├── Filter/ │ │ │ │ ├── BandPass/ │ │ │ │ │ └── BandPassFir.cs │ │ │ │ ├── CircularBuffer.cs │ │ │ │ ├── Connector.cs │ │ │ │ ├── Delay/ │ │ │ │ │ ├── Delay.cs │ │ │ │ │ ├── FractionalDelay.cs │ │ │ │ │ └── IDelay.cs │ │ │ │ ├── Equalizer/ │ │ │ │ │ ├── ButterworthFilterDesigner.cs │ │ │ │ │ ├── ChebyshevFilterDesigner.cs │ │ │ │ │ ├── EllipticFilterDesigner.cs │ │ │ │ │ ├── FilterDesigner.cs │ │ │ │ │ ├── ParametricEqualizer.cs │ │ │ │ │ └── Type.cs │ │ │ │ ├── Filter.cs │ │ │ │ ├── Fir.cs │ │ │ │ ├── FractionalCombFilter.cs │ │ │ │ ├── Iir.cs │ │ │ │ ├── Misc/ │ │ │ │ │ ├── AllPassFilter.cs │ │ │ │ │ ├── Amplifier.cs │ │ │ │ │ ├── CombFilter.cs │ │ │ │ │ ├── Equalizer.cs │ │ │ │ │ └── MultiDelay.cs │ │ │ │ ├── Mixer.cs │ │ │ │ └── readme.txt │ │ │ ├── FilterGenerator/ │ │ │ │ ├── BandPassFir.cs │ │ │ │ ├── Basic.cs │ │ │ │ ├── Comb.cs │ │ │ │ ├── Common.cs │ │ │ │ ├── Connector.cs │ │ │ │ ├── Equalizer.cs │ │ │ │ ├── FilterGeneratorForm.cs │ │ │ │ ├── FilterGeneratorForm.resx │ │ │ │ ├── Fir.cs │ │ │ │ ├── Iir.cs │ │ │ │ └── Mixer.cs │ │ │ ├── Mathematics/ │ │ │ │ ├── Array.cs │ │ │ │ ├── Complex.cs │ │ │ │ ├── ComplexMath.cs │ │ │ │ ├── Constant.cs │ │ │ │ ├── Continuous/ │ │ │ │ │ ├── Function.cs │ │ │ │ │ └── Range.cs │ │ │ │ ├── Discrete/ │ │ │ │ │ ├── CircularConvolution.cs │ │ │ │ │ ├── CircularCorrelation.cs │ │ │ │ │ ├── Convolution.cs │ │ │ │ │ ├── Correlation.cs │ │ │ │ │ ├── Differential.cs │ │ │ │ │ └── Function.cs │ │ │ │ ├── Elliptic.cs │ │ │ │ ├── Expression/ │ │ │ │ │ ├── Polynomial.cs │ │ │ │ │ └── Rational.cs │ │ │ │ ├── Function/ │ │ │ │ │ ├── Algorithm.cs │ │ │ │ │ ├── Binary.cs │ │ │ │ │ ├── CachedFunction.cs │ │ │ │ │ ├── ComplexVariable.cs │ │ │ │ │ ├── Constant.cs │ │ │ │ │ ├── Elementary/ │ │ │ │ │ │ ├── Exp.cs │ │ │ │ │ │ ├── GeneralPolynomial.cs │ │ │ │ │ │ └── Polynomial.cs │ │ │ │ │ ├── Fraction.cs │ │ │ │ │ ├── Function.cs │ │ │ │ │ ├── Imaginary.cs │ │ │ │ │ ├── Multiple.cs │ │ │ │ │ ├── Product.cs │ │ │ │ │ ├── Series.cs │ │ │ │ │ ├── Sum.cs │ │ │ │ │ ├── Unary.cs │ │ │ │ │ ├── Variable.cs │ │ │ │ │ └── VariableTable.cs │ │ │ │ ├── Misc.cs │ │ │ │ ├── Statistics.cs │ │ │ │ └── ThreeDimension/ │ │ │ │ ├── AffineMatrix.cs │ │ │ │ ├── Matrix.cs │ │ │ │ ├── Quaternion.cs │ │ │ │ └── Vector.cs │ │ │ ├── Misc/ │ │ │ │ └── Trace.cs │ │ │ ├── Music/ │ │ │ │ ├── Amplifier.cs │ │ │ │ ├── CompoundSound.cs │ │ │ │ ├── Envelope.cs │ │ │ │ ├── HarmonicTone.cs │ │ │ │ ├── PeriodicSound.cs │ │ │ │ ├── PureTone.cs │ │ │ │ ├── Sound.cs │ │ │ │ ├── SoundFromData.cs │ │ │ │ ├── SoundWithFilter.cs │ │ │ │ ├── Temperament.cs │ │ │ │ ├── Tremolo.cs │ │ │ │ └── Vibrato.cs │ │ │ ├── Pipe/ │ │ │ │ ├── CascadePipe.cs │ │ │ │ ├── Monaural/ │ │ │ │ │ ├── FilteredPipe.cs │ │ │ │ │ ├── RateTransposer.cs │ │ │ │ │ └── TimeStretcher.cs │ │ │ │ ├── Pipe.cs │ │ │ │ ├── Queue.cs │ │ │ │ └── Stereo/ │ │ │ │ ├── FilteredPipe.cs │ │ │ │ ├── PitchShifter.cs │ │ │ │ ├── RateTransposer.cs │ │ │ │ └── TimeStretcher.cs │ │ │ ├── SoundLibrary.csproj │ │ │ ├── SpectrumAnalysis/ │ │ │ │ ├── Fft.cs │ │ │ │ ├── Spectrum.cs │ │ │ │ └── readme.txt │ │ │ ├── Stream/ │ │ │ │ ├── Monaural/ │ │ │ │ │ ├── FilteredStream.cs │ │ │ │ │ ├── RateTransposer.cs │ │ │ │ │ ├── TimeStretcher.cs │ │ │ │ │ └── WaveStream.cs │ │ │ │ └── Stream.cs │ │ │ ├── Util.cs │ │ │ ├── Wave/ │ │ │ │ ├── FilterAdapter.cs │ │ │ │ ├── Util.cs │ │ │ │ ├── Wave.cs │ │ │ │ ├── WaveReader.cs │ │ │ │ ├── WaveWriter.cs │ │ │ │ └── readme.txt │ │ │ ├── WaveAnalysis/ │ │ │ │ ├── DataList.cs │ │ │ │ ├── WaveAnalyzer.cs │ │ │ │ ├── WaveData.cs │ │ │ │ ├── WaveFrequency.cs │ │ │ │ ├── WaveMS.cs │ │ │ │ ├── WaveMonaural.cs │ │ │ │ └── WaveTime.cs │ │ │ ├── documents/ │ │ │ │ ├── Data/ │ │ │ │ │ └── index.html │ │ │ │ ├── Filter/ │ │ │ │ │ ├── BandPass/ │ │ │ │ │ │ └── index.html │ │ │ │ │ ├── Delay/ │ │ │ │ │ │ └── index.html │ │ │ │ │ ├── Equalizer/ │ │ │ │ │ │ └── index.html │ │ │ │ │ ├── Misc/ │ │ │ │ │ │ └── index.html │ │ │ │ │ └── index.html │ │ │ │ ├── Mathematics/ │ │ │ │ │ └── index.html │ │ │ │ ├── Music/ │ │ │ │ │ └── index.html │ │ │ │ ├── Pipe/ │ │ │ │ │ └── index.html │ │ │ │ ├── SpectrumAnalysis/ │ │ │ │ │ └── index.html │ │ │ │ ├── Wave/ │ │ │ │ │ └── index.html │ │ │ │ ├── WaveAnalysis/ │ │ │ │ │ └── index.html │ │ │ │ ├── index.html │ │ │ │ └── style.css │ │ │ └── fft/ │ │ │ ├── Makefile │ │ │ ├── fft.cpp │ │ │ ├── fftsg.c │ │ │ └── readme.txt │ │ ├── UserInputSample/ │ │ │ ├── UserInputSample/ │ │ │ │ ├── App.xaml │ │ │ │ ├── App.xaml.cs │ │ │ │ ├── DelegateCommand.cs │ │ │ │ ├── InputData.cs │ │ │ │ ├── MainWindow.xaml │ │ │ │ ├── MainWindow.xaml.cs │ │ │ │ ├── NotificationObject.cs │ │ │ │ └── UserInputSample.csproj │ │ │ └── UserInputSample.sln │ │ ├── reversi/ │ │ │ ├── AssemblyInfo.cs │ │ │ ├── OptionForm.cs │ │ │ ├── OptionForm.resx │ │ │ ├── Reversi.csproj │ │ │ ├── Reversi.sln │ │ │ ├── ReversiBoard.cs │ │ │ ├── ReversiForm.cs │ │ │ ├── ReversiForm.resx │ │ │ ├── ReversiPanel.cs │ │ │ └── licenses.licx │ │ └── spctrum/ │ │ ├── AppMain/ │ │ │ ├── AppSettings.cs │ │ │ ├── MainForm.cs │ │ │ ├── MainForm.resx │ │ │ ├── WaveGraphForm.cs │ │ │ ├── WaveGraphForm.resx │ │ │ ├── WaveLoadForm.cs │ │ │ ├── WaveLoadForm.resx │ │ │ ├── WaveSaveForm.cs │ │ │ └── WaveSaveForm.resx │ │ ├── AssemblyInfo.cs │ │ ├── Class1.cs │ │ ├── Filter/ │ │ │ ├── CircularBuffer.cs │ │ │ ├── Connector.cs │ │ │ ├── Filter.cs │ │ │ ├── Fir.cs │ │ │ └── Iir.cs │ │ ├── Graph/ │ │ │ ├── Graph.cs │ │ │ ├── Graph.resx │ │ │ ├── GraphForm.cs │ │ │ ├── GraphForm.resx │ │ │ ├── GraphForm2.cs │ │ │ └── GraphForm2.resx │ │ ├── Spectrum.csproj │ │ ├── SpectrumAnalysis/ │ │ │ ├── Common.cs │ │ │ ├── Complex.cs │ │ │ ├── Fft.cs │ │ │ └── Spectrum.cs │ │ ├── Wave/ │ │ │ └── Wave.cs │ │ ├── WaveAnalysis/ │ │ │ ├── DataList.cs │ │ │ ├── WaveAnalyzer.cs │ │ │ └── WaveData.cs │ │ ├── fft/ │ │ │ ├── Makefile │ │ │ ├── fft.cpp │ │ │ ├── fftsg.c │ │ │ ├── readme.txt │ │ │ └── vsvars32.bat │ │ ├── readme/ │ │ │ └── fig.ppt │ │ └── spectrum.sln │ ├── Oop/ │ │ ├── GenericsSample/ │ │ │ ├── GenericsSample.csproj │ │ │ ├── Template.cs │ │ │ ├── TypeErasure.cs │ │ │ ├── ValueType.cs │ │ │ ├── Wrapper.cs │ │ │ └── fig/ │ │ │ └── fig.pptx │ │ ├── InterfaceSample/ │ │ │ ├── Bcl/ │ │ │ │ ├── IComparableSample.cs │ │ │ │ ├── IDisposableSample.cs │ │ │ │ ├── IEnumerableSample.cs │ │ │ │ └── IReadOnlyListSample.cs │ │ │ ├── Explicit/ │ │ │ │ ├── ExpliciteImplementationSample.cs │ │ │ │ ├── GenericInterfaceSample.cs │ │ │ │ ├── MultipleImplementationSample.cs │ │ │ │ └── PolymorphicIEquatableSample.cs │ │ │ ├── InterfaceSample.csproj │ │ │ └── Program.cs │ │ ├── MultipleInheritance/ │ │ │ └── fig/ │ │ │ ├── fig.pptx │ │ │ └── 多重継承問題.docx │ │ ├── Oop.sln │ │ ├── TopLevelAccessibility/ │ │ │ ├── ConsoleApplication/ │ │ │ │ ├── Class1.cs │ │ │ │ ├── ConsoleApplication.csproj │ │ │ │ └── Program.cs │ │ │ ├── ReferredClassLibrary/ │ │ │ │ ├── Inheritance.cs │ │ │ │ ├── Internals.cs │ │ │ │ ├── Nested.cs │ │ │ │ ├── Publics.cs │ │ │ │ └── ReferredClassLibrary.csproj │ │ │ └── fig/ │ │ │ └── fig.pptx │ │ ├── ValueTypeGenerics/ │ │ │ ├── AvoidBoxing.cs │ │ │ ├── BinaryOperationBenchmark.cs │ │ │ ├── Foreach/ │ │ │ │ ├── Iterator/ │ │ │ │ │ └── Program.cs │ │ │ │ └── Struct/ │ │ │ │ └── Program.cs │ │ │ ├── GenericArithmeticOperators/ │ │ │ │ ├── Generics/ │ │ │ │ │ └── Program.cs │ │ │ │ ├── IBinaryOperator.cs │ │ │ │ ├── Interface/ │ │ │ │ │ └── Program.cs │ │ │ │ ├── Program.cs │ │ │ │ └── PseudoStatic/ │ │ │ │ └── Program.cs │ │ │ ├── Program.cs │ │ │ └── ValueTypeGenerics.csproj │ │ ├── Variance/ │ │ │ ├── ArrayCovariance.cs │ │ │ ├── Base.cs │ │ │ ├── Contravariance.cs │ │ │ ├── Covariance.cs │ │ │ ├── NestedVariance.cs │ │ │ ├── Program.cs │ │ │ └── Variance.csproj │ │ └── fig/ │ │ └── fig.pptx │ ├── Package/ │ │ └── TypeForwarding/ │ │ ├── BasicSamples/ │ │ │ ├── ActualLibrary/ │ │ │ │ ├── ActualLibrary.csproj │ │ │ │ ├── Class1.cs │ │ │ │ └── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ └── ConsoleApplication1/ │ │ │ ├── App.config │ │ │ ├── Program.cs │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ └── _ConsoleApplication1.csproj │ │ ├── FormattableString/ │ │ │ ├── ClassLibrary35/ │ │ │ │ ├── ClassLibrary35.csproj │ │ │ │ ├── Formatter1.cs │ │ │ │ ├── IFormatter.cs │ │ │ │ └── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── ClassLibrary46/ │ │ │ │ ├── ClassLibrary46.csproj │ │ │ │ ├── Formatter2.cs │ │ │ │ └── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── FormattableString20/ │ │ │ │ ├── FormattableString.cs │ │ │ │ ├── FormattableString20.csproj │ │ │ │ └── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── FormattableString46/ │ │ │ │ ├── FormattableString.cs │ │ │ │ ├── FormattableString46.csproj │ │ │ │ └── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── Sample35/ │ │ │ │ ├── Program.cs │ │ │ │ ├── Properties/ │ │ │ │ │ └── AssemblyInfo.cs │ │ │ │ └── Sample35.csproj │ │ │ └── Sample46/ │ │ │ ├── App.config │ │ │ ├── Program.cs │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ └── Sample46.csproj │ │ ├── TypeForwarding.sln │ │ ├── TypeForwardingLibrary/ │ │ │ ├── AssemblyAttributes.cs │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ └── TypeForwardingLibrary.csproj │ │ ├── VersioningSamples/ │ │ │ ├── Version1/ │ │ │ │ └── MonolithicClassLibrary/ │ │ │ │ ├── HttpExtensions.cs │ │ │ │ ├── MonolithicClassLibrary.csproj │ │ │ │ ├── NumericExtensions.cs │ │ │ │ ├── Properties/ │ │ │ │ │ └── AssemblyInfo.cs │ │ │ │ └── StringExtensions.cs │ │ │ └── Version2/ │ │ │ ├── HttpClassLibrary/ │ │ │ │ ├── HttpClassLibrary.csproj │ │ │ │ ├── HttpExtensions.cs │ │ │ │ └── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── MonolithicClassLibrary/ │ │ │ │ ├── MonolithicClassLibrary.V2.csproj │ │ │ │ ├── Properties/ │ │ │ │ │ └── AssemblyInfo.cs │ │ │ │ └── TypeForward.cs │ │ │ ├── NumericClassLibrary/ │ │ │ │ ├── NumericClassLibrary.csproj │ │ │ │ ├── NumericExtensions.cs │ │ │ │ └── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ └── StringClassLibrary/ │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── StringClassLibrary.csproj │ │ │ └── StringExtensions.cs │ │ └── fig/ │ │ └── fig.pptx │ ├── Resource/ │ │ ├── Boxing/ │ │ │ ├── Boxing.csproj │ │ │ ├── Generics/ │ │ │ │ └── Program.cs │ │ │ ├── IntAsObject/ │ │ │ │ └── Program.cs │ │ │ ├── Program.cs │ │ │ └── ToString/ │ │ │ └── Program.cs │ │ ├── ByRef/ │ │ │ ├── ByRef.csproj │ │ │ ├── InOutAreRef.cs │ │ │ ├── InParameter/ │ │ │ │ ├── InCopy.cs │ │ │ │ └── Quarternion.cs │ │ │ ├── OutParameter/ │ │ │ │ ├── Out.cs │ │ │ │ └── Ref.cs │ │ │ ├── Program.cs │ │ │ ├── RefExtensions/ │ │ │ │ ├── FieldRef.cs │ │ │ │ ├── Generics.cs │ │ │ │ └── Quarternion.cs │ │ │ ├── RefReassignment/ │ │ │ │ ├── RefFor.cs │ │ │ │ ├── RefForeach.cs │ │ │ │ ├── RefReassingment.cs │ │ │ │ └── RefReassingmentMax.cs │ │ │ └── StackOnly.cs │ │ ├── ClassOrStruct/ │ │ │ ├── ClassOrStruct.csproj │ │ │ ├── Csharp6.cs │ │ │ ├── DefaultValue.cs │ │ │ ├── Memberwise.cs │ │ │ ├── ParameterlessConstructor.cs │ │ │ ├── Program.cs │ │ │ ├── SampleClass.cs │ │ │ └── SampleStruct.cs │ │ ├── RecursiveReadOnly/ │ │ │ ├── ClassReadonly.cs │ │ │ ├── Copy.cs │ │ │ ├── Program.cs │ │ │ ├── ReadonlyStruct.cs │ │ │ ├── RecursiveReadOnly.csproj │ │ │ ├── StructReadonly.cs │ │ │ └── ThisRewrite.cs │ │ ├── RefAndPointer/ │ │ │ ├── NullRef.cs │ │ │ ├── RefAndPointer.csproj │ │ │ ├── UnsafeClass.cs │ │ │ └── UnsafeRef.cs │ │ ├── RefReturns/ │ │ │ ├── App.config │ │ │ ├── MultiStepRef/ │ │ │ │ └── Program.cs │ │ │ ├── Pointers/ │ │ │ │ └── Program.cs │ │ │ ├── Program.cs │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── RefLocals/ │ │ │ │ └── Program.cs │ │ │ ├── RefReturns/ │ │ │ │ └── Program.cs │ │ │ ├── RefReturns.csproj │ │ │ ├── Summary.cs │ │ │ └── ValueTypePassedByReference/ │ │ │ ├── ArraySample.cs │ │ │ ├── Capsuled/ │ │ │ │ └── Program.cs │ │ │ ├── CircularBuffer.cs │ │ │ ├── ImmutablePoint.cs │ │ │ ├── Program.cs │ │ │ ├── Raw/ │ │ │ │ └── Program.cs │ │ │ └── Ref/ │ │ │ └── Program.cs │ │ ├── ResourceManagement.sln │ │ ├── Span/ │ │ │ ├── .gitignore │ │ │ ├── Pointer.cs │ │ │ ├── Program.cs │ │ │ ├── SafeStackalloc.cs │ │ │ ├── Span.csproj │ │ │ ├── SpanSafetyRules.cs │ │ │ ├── StreamRead.cs │ │ │ ├── Substring.cs │ │ │ └── VariousTypeOfMemory.cs │ │ ├── StructLayoutSample/ │ │ │ ├── AbuseUnion.cs │ │ │ ├── AutoLayout.cs │ │ │ ├── ExplicitLayout.cs │ │ │ ├── IllegalAddress.cs │ │ │ ├── IllegalLayout.cs │ │ │ ├── SequentialLayout.Pack.cs │ │ │ ├── SequentialLayout.cs │ │ │ ├── StructLayoutSample.csproj │ │ │ └── Union.cs │ │ ├── StructPerformance/ │ │ │ ├── Class/ │ │ │ │ ├── Immutable/ │ │ │ │ │ ├── Calculator.cs │ │ │ │ │ └── Vector.cs │ │ │ │ └── Mutable/ │ │ │ │ ├── Calculator.cs │ │ │ │ └── Vector.cs │ │ │ ├── ICalculator.cs │ │ │ ├── Program.cs │ │ │ ├── RandomExtensions.cs │ │ │ ├── Struct/ │ │ │ │ ├── Immutable/ │ │ │ │ │ ├── Calculator.cs │ │ │ │ │ └── Vector.cs │ │ │ │ └── Mutable/ │ │ │ │ ├── Calculator.cs │ │ │ │ └── Vector.cs │ │ │ └── StructPerformance.csproj │ │ ├── WeakReference/ │ │ │ ├── HowToUse/ │ │ │ │ └── Program.cs │ │ │ ├── Program.cs │ │ │ ├── WeakEvent/ │ │ │ │ ├── Program.cs │ │ │ │ ├── WeakEventExtensions.AsWeakObservable.cs │ │ │ │ ├── WeakEventExtensions.FinalizeDiposable.cs │ │ │ │ └── WeakEventExtensions.cs │ │ │ ├── WeakReference.csproj │ │ │ └── WeakTable/ │ │ │ ├── Person.cs │ │ │ └── Program.cs │ │ └── fig/ │ │ ├── fig nre.pptx │ │ ├── fig readonly.pptx │ │ ├── fig ref.pptx │ │ └── fig span.pptx │ ├── Scripting/ │ │ ├── Scripting.sln │ │ ├── TurtleGraphics/ │ │ │ ├── App.config │ │ │ ├── App.xaml │ │ │ ├── App.xaml.cs │ │ │ ├── MainWindow.xaml │ │ │ ├── MainWindow.xaml.cs │ │ │ ├── Properties/ │ │ │ │ ├── AssemblyInfo.cs │ │ │ │ ├── Resources.Designer.cs │ │ │ │ ├── Resources.resx │ │ │ │ ├── Settings.Designer.cs │ │ │ │ └── Settings.settings │ │ │ ├── TurtleGraphics.csproj │ │ │ ├── ViewModels/ │ │ │ │ ├── BindableBase.cs │ │ │ │ ├── Command.cs │ │ │ │ ├── Commander.cs │ │ │ │ ├── Cursor.ValueChanged.cs │ │ │ │ ├── Cursor.cs │ │ │ │ ├── Line.ValueChanged.cs │ │ │ │ ├── Line.cs │ │ │ │ └── TurtleGraphicsViewModel.cs │ │ │ └── project.json │ │ ├── global.json │ │ └── src/ │ │ └── Scripting/ │ │ ├── Program.cs │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── Scripting.xproj │ │ ├── a.csx │ │ └── project.json │ ├── Start/ │ │ ├── IdentifierScope/ │ │ │ ├── AfterDeclaration.cs │ │ │ ├── AnonymousFunction.cs │ │ │ ├── EmbeddedStatement.cs │ │ │ ├── For.cs │ │ │ ├── Foreach.cs │ │ │ ├── IdentifierScope.csproj │ │ │ ├── IsOperator.cs │ │ │ ├── Iterator.cs │ │ │ ├── Lifetime.cs │ │ │ ├── LocalFunctions.cs │ │ │ ├── Loop.cs │ │ │ ├── Member.cs │ │ │ ├── Method.cs │ │ │ ├── Nest.cs │ │ │ ├── Program.cs │ │ │ ├── Scope.cs │ │ │ ├── TypeName.cs │ │ │ ├── TypeName1.cs │ │ │ └── TypeName2.cs │ │ ├── Start.sln │ │ ├── StringInterplation/ │ │ │ ├── Overload.cs │ │ │ ├── Program.cs │ │ │ └── StringInterplation.csproj │ │ ├── Variables/ │ │ │ ├── Literals.cs │ │ │ ├── Program.cs │ │ │ └── Variables.csproj │ │ └── fig/ │ │ └── fig.pptx │ ├── StructuredProgramming/ │ │ ├── BackportEnumerable/ │ │ │ ├── Action.cs │ │ │ ├── BackportEnumerable.csproj │ │ │ ├── Func.cs │ │ │ ├── Linq/ │ │ │ │ └── Enumerable.cs │ │ │ ├── Runtime/ │ │ │ │ └── CompilerServices/ │ │ │ │ └── ExtensionAttribute.cs │ │ │ └── readme.txt │ │ ├── Exceptions/ │ │ │ ├── ExceptionFilterSample.cs │ │ │ ├── ExceptionImplementation.cs │ │ │ ├── Exceptions.csproj │ │ │ ├── IgnoreErrorImplementation.cs │ │ │ ├── Program.cs │ │ │ ├── ReturnCodeImplementation.cs │ │ │ └── ThrowExpressions.cs │ │ ├── Expressions/ │ │ │ ├── Expressions.cs │ │ │ ├── Expressions.csproj │ │ │ ├── Program.cs │ │ │ └── Statements.cs │ │ ├── ExternAliasConsoleApplication/ │ │ │ ├── ExternAliasConsoleApplication.csproj │ │ │ └── Program.cs │ │ ├── Function/ │ │ │ ├── ExpressionBodied.cs │ │ │ ├── FuncAction.cs │ │ │ ├── Function.csproj │ │ │ ├── InputNumberSample.cs │ │ │ ├── MultipleReturns.cs │ │ │ ├── MyMath.cs │ │ │ ├── NoParameterNoReturn.cs │ │ │ ├── OverloadSample.cs │ │ │ └── Program.cs │ │ ├── Inlining/ │ │ │ ├── CommonExecutionPath.cs │ │ │ ├── Inlining.csproj │ │ │ ├── Program.cs │ │ │ ├── SimpleAdd.cs │ │ │ └── WithLoop.cs │ │ ├── Namespaces/ │ │ │ ├── MyApp.cs │ │ │ ├── Namespaces.csproj │ │ │ ├── Program.cs │ │ │ └── global.cs │ │ ├── OverloadResolution/ │ │ │ ├── OverloadResolution/ │ │ │ │ ├── Ambiguous.cs │ │ │ │ ├── Csharp6Lambda.cs │ │ │ │ ├── Csharp73/ │ │ │ │ │ ├── ColorColor.cs │ │ │ │ │ ├── DummyOptionalParamter.cs │ │ │ │ │ ├── GenericConstraints.cs │ │ │ │ │ ├── MethodReturn.cs │ │ │ │ │ ├── Refness.cs │ │ │ │ │ ├── Static.cs │ │ │ │ │ ├── StructClass.cs │ │ │ │ │ └── UncompilableStatic.cs │ │ │ │ ├── ExpressionTree.cs │ │ │ │ ├── Extensions.cs │ │ │ │ ├── Generic.cs │ │ │ │ ├── Inference.cs │ │ │ │ ├── Lambda.cs │ │ │ │ ├── OptionalParameter.cs │ │ │ │ ├── OverloadResolution.csproj │ │ │ │ ├── Paremeter.cs │ │ │ │ ├── StringInterpolation.cs │ │ │ │ └── ValueType.cs │ │ │ └── OverloadResolution.sln │ │ ├── Params/ │ │ │ ├── NoParam.cs │ │ │ └── Params.csproj │ │ ├── StructuredProgramming.sln │ │ ├── Tuples/ │ │ │ ├── AnonymousTypes.cs │ │ │ ├── Tuples.cs │ │ │ ├── Tuples.csproj │ │ │ ├── TypeX.cs │ │ │ └── personal_infomation.csv │ │ └── fig/ │ │ ├── fig expressions.pptx │ │ └── fig function.pptx │ └── ufcpp2000/ │ ├── algorithm/ │ │ ├── fig/ │ │ │ └── fig.ppt │ │ └── src/ │ │ ├── ArrayList.cs │ │ ├── BinaryTree.cs │ │ ├── CircularBuffer.cs │ │ ├── Dictionary.cs │ │ ├── ForwardLinkedList.cs │ │ ├── HashTable.cs │ │ ├── LinkedList.cs │ │ ├── PriorityQueue.cs │ │ ├── Queue.cs │ │ ├── Set.cs │ │ ├── Sort.cs │ │ ├── SortedArray.cs │ │ └── Stack.cs │ ├── common/ │ │ ├── ads │ │ ├── footer │ │ ├── googlecolor.js │ │ ├── header │ │ ├── ifooter │ │ ├── iheader │ │ ├── mfooter │ │ ├── mheader │ │ ├── underbody │ │ ├── undermenu │ │ └── 没/ │ │ └── Live Search.txt │ ├── computer/ │ │ └── fig/ │ │ ├── GateLevel/ │ │ │ └── fig.pptx │ │ ├── Logical/ │ │ │ └── fig.pptx │ │ ├── fig.ppt │ │ └── fig.pptx │ ├── csharp/ │ │ ├── demo/ │ │ │ └── readme.md │ │ ├── dic/ │ │ │ ├── .htaccess │ │ │ ├── reversedic.css │ │ │ ├── reversedic.html │ │ │ ├── reversedic.xml │ │ │ └── reversedic.xsl │ │ ├── draft/ │ │ │ ├── Characteristics.cs │ │ │ ├── Characteristics.txt │ │ │ ├── CharacteristicsViewModel.cs │ │ │ ├── DelegateCommand.cs │ │ │ ├── SampleClass.cs │ │ │ ├── SampleClass.xml │ │ │ └── ViewModelTemplate.ps1 │ │ ├── fig/ │ │ │ ├── Framework/ │ │ │ │ └── fig framework.pptx │ │ │ ├── Function/ │ │ │ │ └── fig function.pptx │ │ │ ├── LinqToSql.pptx │ │ │ ├── fig Interop.pptx │ │ │ ├── fig OOP.pptx │ │ │ ├── fig appendix.pptx │ │ │ ├── fig immutable.pptx │ │ │ ├── fig null.pptx │ │ │ ├── fig はじめに.pptx │ │ │ ├── fig データ処理.pptx │ │ │ ├── fig リソース管理.pptx │ │ │ ├── fig 例外.pptx │ │ │ ├── fig 動的.pptx │ │ │ ├── fig 基礎.pptx │ │ │ ├── fig 構造化.pptx │ │ │ ├── fig 索引・概要.pptx │ │ │ ├── fig 関数型.pptx │ │ │ ├── fig 非同期.pptx │ │ │ ├── fig.ppt │ │ │ ├── fig.pptx │ │ │ ├── inheritance.emf │ │ │ ├── multithread1.emf │ │ │ ├── multithread2.emf │ │ │ ├── oop0.emf │ │ │ ├── oop1.emf │ │ │ ├── oop3.emf │ │ │ ├── pointer1.emf │ │ │ ├── ref1.emf │ │ │ ├── ref2.emf │ │ │ ├── ref3.emf │ │ │ ├── ref4.emf │ │ │ ├── ref5.emf │ │ │ ├── refval0.emf │ │ │ ├── refval1.emf │ │ │ ├── refval2.emf │ │ │ ├── refval3.emf │ │ │ ├── thread.emf │ │ │ └── thread.pptx │ │ ├── movie/ │ │ │ ├── GetStarted/ │ │ │ │ ├── Arithmetic.wmv │ │ │ │ ├── Cast.wmv │ │ │ │ ├── For.wmv │ │ │ │ ├── Foreach.wmv │ │ │ │ ├── Function.wmv │ │ │ │ ├── HelloWorld.wmv │ │ │ │ ├── HelloWorldHD.wmv │ │ │ │ ├── IfElse.wmv │ │ │ │ ├── String.wmv │ │ │ │ ├── Struct.wmv │ │ │ │ ├── UsageFirst.wmv │ │ │ │ ├── Variable1.wmv │ │ │ │ ├── Variable2.wmv │ │ │ │ └── While.wmv │ │ │ └── VideoPlayer.xap │ │ ├── sample/ │ │ │ └── SoundLibrary/ │ │ │ ├── Data/ │ │ │ │ └── index.html │ │ │ ├── Filter/ │ │ │ │ ├── BandPass/ │ │ │ │ │ └── index.html │ │ │ │ ├── Delay/ │ │ │ │ │ └── index.html │ │ │ │ ├── Equalizer/ │ │ │ │ │ └── index.html │ │ │ │ ├── Misc/ │ │ │ │ │ └── index.html │ │ │ │ └── index.html │ │ │ ├── Mathematics/ │ │ │ │ └── index.html │ │ │ ├── Music/ │ │ │ │ └── index.html │ │ │ ├── Pipe/ │ │ │ │ └── index.html │ │ │ ├── SpectrumAnalysis/ │ │ │ │ └── index.html │ │ │ ├── Wave/ │ │ │ │ └── index.html │ │ │ ├── WaveAnalysis/ │ │ │ │ └── index.html │ │ │ ├── index.html │ │ │ └── style.css │ │ ├── slide/ │ │ │ ├── LINQ.pptx │ │ │ ├── WcfDemo.pptx │ │ │ ├── WcfDemo.xps │ │ │ ├── dotnet4.pptx │ │ │ ├── dynamics.pptx │ │ │ ├── dynamics.xps │ │ │ └── model/ │ │ │ ├── Factoring.pptx │ │ │ ├── Procedure.pptx │ │ │ ├── Variable.pptx │ │ │ └── テンプレート.pptx │ │ ├── source/ │ │ │ ├── ComicMinimal.cs │ │ │ ├── Complex.cs │ │ │ ├── Comprehension.cs │ │ │ ├── CreateTestData.cs │ │ │ ├── DuckTypingInterface.cs │ │ │ ├── DynamicXml.cs │ │ │ ├── ExpressionTemplates.xaml │ │ │ ├── ExpressionTest.cs │ │ │ ├── ExpressionTreeTemplates.xaml │ │ │ ├── MemoryImage.mg │ │ │ ├── MultipleDispatch.cs │ │ │ ├── Operator.cs │ │ │ ├── Query.cs │ │ │ ├── Rational.cs │ │ │ ├── SleepSort.cs │ │ │ ├── TypesForTest.cs │ │ │ ├── _vti_cnf/ │ │ │ │ ├── ComicMinimal.cs │ │ │ │ ├── Complex.cs │ │ │ │ ├── Comprehension.cs │ │ │ │ ├── CreateTestData.cs │ │ │ │ ├── DuckTypingInterface.cs │ │ │ │ ├── DynamicXml.cs │ │ │ │ ├── ExpressionTemplates.xaml │ │ │ │ ├── ExpressionTest.cs │ │ │ │ ├── ExpressionTreeTemplates.xaml │ │ │ │ ├── MemoryImage.mg │ │ │ │ ├── MultipleDispatch.cs │ │ │ │ ├── Operator.cs │ │ │ │ ├── Query.cs │ │ │ │ ├── Rational.cs │ │ │ │ └── TypesForTest.cs │ │ │ └── コンマ区切り.cs │ │ └── 元原稿/ │ │ ├── プレゼンテーション1.pptx │ │ ├── 非同期処理の基礎知識/ │ │ │ ├── 1 非同期処理の書き方.docx │ │ │ └── イベントの自動実装.docx │ │ └── 非同期制御フロー.docx │ ├── dotnet/ │ │ ├── fig/ │ │ │ ├── fig IL.pptx │ │ │ ├── fig collection.pptx │ │ │ ├── fig.ppt │ │ │ ├── fig.pptx │ │ │ └── silverlight-fig.pptx │ │ ├── resources/ │ │ │ ├── RssWriter.cs │ │ │ ├── main.css │ │ │ └── main.xsl │ │ └── sample/ │ │ ├── BindingSlider.xaml │ │ ├── ButtonClick.xaml │ │ ├── Gradation.xaml │ │ ├── LineArt.xaml │ │ ├── MouseEnter.xaml │ │ ├── ResourceDictionary.xaml │ │ ├── StyleForButton.xaml │ │ ├── StyleForLabel.xaml │ │ ├── VistaLikeButton.xaml │ │ ├── paragraph.xaml │ │ └── viewport3d.xaml │ ├── dsl/ │ │ ├── fig/ │ │ │ └── fig.pptx │ │ ├── slide/ │ │ │ └── DslIdea.pptx │ │ ├── source/ │ │ │ ├── sample.dsl │ │ │ └── stack.mg │ │ └── src/ │ │ ├── ClassToXaml.xsl │ │ ├── LibClass.ps1 │ │ ├── SimpleClass.cs │ │ ├── SimpleClass.xaml │ │ ├── SimpleClass.xml │ │ ├── TestLibClass.ps1 │ │ └── Translate.ps1 │ ├── math/ │ │ ├── card00.emf │ │ ├── demo/ │ │ │ ├── matrix.xbap │ │ │ ├── matrix_1_0_0_0/ │ │ │ │ └── matrix.exe.manifest │ │ │ └── matrix_1_0_0_0.xbap │ │ ├── elliptic-fig.ppt │ │ ├── fig/ │ │ │ ├── fig.ppt │ │ │ ├── lopital00.emf │ │ │ ├── lopital01.emf │ │ │ ├── lopital02.emf │ │ │ ├── lopital03.emf │ │ │ └── lopital04.emf │ │ ├── fig.ppt │ │ ├── group-fig.ppt │ │ ├── infinity-fig.ppt │ │ ├── linear0.emf │ │ ├── linear1.emf │ │ ├── manifold-fig.ppt │ │ ├── miscmath-fig.ppt │ │ ├── prec_succ.emf │ │ ├── quaternion01.emf │ │ ├── riemann0.emf │ │ ├── riemann1.emf │ │ └── set-fig.ppt │ ├── misc/ │ │ ├── fig.ppt │ │ └── lecture/ │ │ ├── linear.ppt │ │ └── vorec.ppt │ ├── miscprog/ │ │ └── training/ │ │ ├── bug/ │ │ │ ├── 01equal.c │ │ │ ├── 02offbyone.c │ │ │ ├── 03priority.c │ │ │ ├── 04and.c │ │ │ ├── 05elseif.c │ │ │ ├── 06int.c │ │ │ ├── 07range.c │ │ │ ├── 08define.c │ │ │ ├── 09jpspace.c │ │ │ ├── 10array.c │ │ │ └── 11other.c │ │ ├── oop/ │ │ │ └── presentation.ppt │ │ ├── rad/ │ │ │ ├── 01helloworld.txt │ │ │ ├── 02viewer.txt │ │ │ ├── 03lineart.txt │ │ │ ├── 04wpf.txt │ │ │ ├── LineArt.xaml │ │ │ └── viewport3d.xaml │ │ └── std/ │ │ └── presentation.ppt │ ├── office/ │ │ └── WordMath/ │ │ ├── WordMath.docx │ │ ├── WordMath.xps │ │ └── WordMathAcl.xlsx │ ├── physics/ │ │ ├── fig.ppt │ │ ├── surface.cs │ │ └── todo.txt │ ├── powershell/ │ │ └── source/ │ │ ├── ZipLib.ps1 │ │ └── ZipVsProjects.ps1 │ ├── sp/ │ │ ├── digital_filter_fig.ppt │ │ ├── fig.ppt │ │ ├── image-fig.ppt │ │ └── src/ │ │ ├── Amplifier.cs │ │ ├── CircularBuffer1.cs │ │ ├── CircularBuffer2.cs │ │ ├── CircularBuffer3.cs │ │ ├── Delay.cs │ │ ├── FirFilter.cs │ │ ├── IFilter.cs │ │ ├── IirFilter.cs │ │ ├── SerialIirFilter.cs │ │ └── Util.cs │ ├── xml/ │ │ ├── reference/ │ │ │ ├── Fourier │ │ │ ├── Pi │ │ │ ├── Re │ │ │ ├── Res │ │ │ ├── Sigma │ │ │ ├── abs │ │ │ ├── aleph │ │ │ ├── arg │ │ │ ├── bar │ │ │ ├── brace │ │ │ ├── bracket │ │ │ ├── branch │ │ │ ├── conjugate │ │ │ ├── d │ │ │ ├── ddt │ │ │ ├── differential │ │ │ ├── doubleint │ │ │ ├── e │ │ │ ├── font │ │ │ ├── frac │ │ │ ├── int │ │ │ ├── limit │ │ │ ├── log │ │ │ ├── matrix │ │ │ ├── oint │ │ │ ├── operator │ │ │ ├── paren │ │ │ ├── pddt │ │ │ ├── pddt_second │ │ │ ├── sin │ │ │ ├── sqbracket │ │ │ ├── subsup │ │ │ ├── symbol │ │ │ ├── tripleint │ │ │ ├── va │ │ │ ├── vec │ │ │ └── vervec │ │ ├── style/ │ │ │ ├── common │ │ │ ├── div.math │ │ │ ├── span.bar │ │ │ ├── span.bold │ │ │ ├── span.integral │ │ │ ├── span.math │ │ │ ├── span.matrix │ │ │ ├── span.normal │ │ │ ├── span.paren │ │ │ ├── span.script │ │ │ ├── span.vector │ │ │ ├── table.branch │ │ │ ├── table.frac │ │ │ ├── table.integral │ │ │ ├── table.matrix │ │ │ ├── table.sigma │ │ │ ├── table.subsup │ │ │ ├── td.intsub │ │ │ ├── td.intsup │ │ │ ├── td.num │ │ │ ├── td.sigma │ │ │ └── td.sigmasub │ │ └── xsl/ │ │ ├── Fourier │ │ ├── Im │ │ ├── Laplace │ │ ├── Pi │ │ ├── Re │ │ ├── Res │ │ ├── Sigma │ │ ├── Sigma sub │ │ ├── Z │ │ ├── abs │ │ ├── aleph │ │ ├── arg │ │ ├── bar │ │ ├── bold │ │ ├── brace │ │ ├── bracket │ │ ├── branch │ │ ├── branch case cond │ │ ├── branch case equ │ │ ├── cite │ │ ├── conjugate │ │ ├── cos │ │ ├── d │ │ ├── dS │ │ ├── dV │ │ ├── ddt │ │ ├── differential │ │ ├── divergence │ │ ├── dl │ │ ├── doubleint │ │ ├── e │ │ ├── exp │ │ ├── factrorial │ │ ├── footer.txt │ │ ├── frac │ │ ├── frac denom │ │ ├── frac num │ │ ├── func │ │ ├── funcsub │ │ ├── function │ │ ├── gradient │ │ ├── header.txt │ │ ├── int │ │ ├── int sub │ │ ├── int sup │ │ ├── inv │ │ ├── lim │ │ ├── log │ │ ├── matrix │ │ ├── matrix row │ │ ├── matrix row elem │ │ ├── nabra │ │ ├── number │ │ ├── oint │ │ ├── operator │ │ ├── paren │ │ ├── pddt │ │ ├── pddt_second │ │ ├── rotation │ │ ├── script │ │ ├── sin │ │ ├── sqbracket │ │ ├── sqrt │ │ ├── subsup │ │ ├── subsup sub │ │ ├── sup │ │ ├── symbol │ │ ├── tan │ │ ├── text │ │ ├── textdiv │ │ ├── textgrad │ │ ├── textrot │ │ ├── tripleint │ │ ├── vec │ │ ├── vervec │ │ └── vervec elem │ └── xsd/ │ ├── css.xsd │ ├── division.xsd │ ├── document.xsd │ ├── exercise.xsd │ ├── figure.xsd │ ├── html.xsd │ ├── index.xsd │ ├── keyword.xsd │ ├── link.xsd │ ├── math.xsd │ ├── other.xsd │ ├── ref.xsd │ ├── silverlight.xsd │ ├── source.xsd │ └── variable.xsd ├── Demo/ │ ├── 2015/ │ │ ├── CompilerPlatform/ │ │ │ ├── CompilerPlatform.sln │ │ │ ├── CsharpEssentialsDemo/ │ │ │ │ ├── App.config │ │ │ │ ├── CsharpEssentialsDemo.csproj │ │ │ │ ├── Program.cs │ │ │ │ └── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── FluentArithmeticDemo/ │ │ │ │ ├── App.config │ │ │ │ ├── FluentArithmeticDemo.csproj │ │ │ │ ├── Program.cs │ │ │ │ ├── Properties/ │ │ │ │ │ └── AssemblyInfo.cs │ │ │ │ └── packages.config │ │ │ ├── LazyMixinDemo/ │ │ │ │ ├── App.config │ │ │ │ ├── Counter.cs │ │ │ │ ├── LazyMixinDemo.csproj │ │ │ │ ├── LazyMixinDemo.ruleset │ │ │ │ ├── Program.cs │ │ │ │ ├── Properties/ │ │ │ │ │ └── AssemblyInfo.cs │ │ │ │ ├── Sample.cs │ │ │ │ └── packages.config │ │ │ ├── NameofDemo/ │ │ │ │ ├── App.config │ │ │ │ ├── NameofDemo.csproj │ │ │ │ ├── Program.cs │ │ │ │ └── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── NotifyPropertyChangedGeneratorDemo/ │ │ │ │ ├── App.config │ │ │ │ ├── NotifyAttribute.cs │ │ │ │ ├── NotifyPropertyChangedGeneratorDemo.csproj │ │ │ │ ├── NotifyPropertyChangedGeneratorDemo.ruleset │ │ │ │ ├── Program.cs │ │ │ │ ├── Properties/ │ │ │ │ │ └── AssemblyInfo.cs │ │ │ │ └── packages.config │ │ │ ├── QuickActions/ │ │ │ │ ├── App.config │ │ │ │ ├── Program.cs │ │ │ │ ├── Properties/ │ │ │ │ │ └── AssemblyInfo.cs │ │ │ │ └── QuickActions.csproj │ │ │ └── RecordDemo/ │ │ │ ├── App.config │ │ │ ├── Program.cs │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ └── RecordDemo.csproj │ │ └── MyRoslynAnalyzers/ │ │ ├── Lazy/ │ │ │ ├── App.config │ │ │ ├── Lazy.csproj │ │ │ ├── Program.cs │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── Sample.cs │ │ │ ├── X.cs │ │ │ ├── packages.config │ │ │ └── コード生成デモ用.cs │ │ ├── MyRoslynAnalyzers.sln │ │ ├── NotifyPropertyChanged/ │ │ │ ├── App.config │ │ │ ├── NotifyAttribute.cs │ │ │ ├── NotifyPropertyChanged.csproj │ │ │ ├── Program.cs │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── Sample.cs │ │ │ ├── packages.config │ │ │ └── コード生成デモ用.cs │ │ ├── RecordConstructor/ │ │ │ ├── App.config │ │ │ ├── Program.cs │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── RecordConstructor.csproj │ │ │ ├── Sample.cs │ │ │ ├── packages.config │ │ │ └── コード生成デモ用.cs │ │ ├── StructPitfall/ │ │ │ ├── App.config │ │ │ ├── Program.cs │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ └── StructPitfall.csproj │ │ └── ValueChanged/ │ │ ├── App.config │ │ ├── BindableBase.cs │ │ ├── Program.cs │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── Sample.ValueChanged.cs │ │ ├── Sample.cs │ │ ├── ValueChanged.csproj │ │ ├── packages.config │ │ └── コード生成デモ用.cs │ ├── 2016/ │ │ ├── Channels/ │ │ │ ├── Channels.sln │ │ │ ├── samples/ │ │ │ │ └── CardBattle/ │ │ │ │ ├── CardBattle.Client/ │ │ │ │ │ ├── App.config │ │ │ │ │ ├── App.xaml │ │ │ │ │ ├── App.xaml.cs │ │ │ │ │ ├── CardBattle.Client.csproj │ │ │ │ │ ├── CardBattle.Client.ruleset │ │ │ │ │ ├── MainWindow.xaml │ │ │ │ │ ├── MainWindow.xaml.cs │ │ │ │ │ ├── Properties/ │ │ │ │ │ │ ├── AssemblyInfo.cs │ │ │ │ │ │ ├── Resources.Designer.cs │ │ │ │ │ │ ├── Resources.resx │ │ │ │ │ │ ├── Settings.Designer.cs │ │ │ │ │ │ └── Settings.settings │ │ │ │ │ ├── Views/ │ │ │ │ │ │ ├── CommandSelectControl.xaml │ │ │ │ │ │ ├── CommandSelectControl.xaml.cs │ │ │ │ │ │ ├── ContinuePromptControl.xaml │ │ │ │ │ │ ├── ContinuePromptControl.xaml.cs │ │ │ │ │ │ ├── Extensions.cs │ │ │ │ │ │ ├── NumberTextConverter.cs │ │ │ │ │ │ ├── PlayAreaControl.xaml │ │ │ │ │ │ ├── PlayAreaControl.xaml.cs │ │ │ │ │ │ ├── PlayerColorConverter.cs │ │ │ │ │ │ ├── SuitBrushConverter.cs │ │ │ │ │ │ └── SuitStringConverter.cs │ │ │ │ │ └── project.json │ │ │ │ ├── CardBattle.Models/ │ │ │ │ │ ├── CardBattle.Models.csproj │ │ │ │ │ ├── GameEngine.cs │ │ │ │ │ ├── GameRules/ │ │ │ │ │ │ ├── Ability.cs │ │ │ │ │ │ ├── Boss.cs │ │ │ │ │ │ ├── Card.cs │ │ │ │ │ │ ├── Hand.cs │ │ │ │ │ │ ├── Judge.cs │ │ │ │ │ │ ├── PlayArea.cs │ │ │ │ │ │ └── Player.cs │ │ │ │ │ ├── GameStatus.cs │ │ │ │ │ ├── Lib/ │ │ │ │ │ │ ├── BindableBase.cs │ │ │ │ │ │ ├── EnumerableEx.cs │ │ │ │ │ │ └── RandomExtensions.cs │ │ │ │ │ ├── Messages/ │ │ │ │ │ │ ├── BossAttack.cs │ │ │ │ │ │ ├── CommandPrompt.cs │ │ │ │ │ │ ├── Continue.cs │ │ │ │ │ │ ├── ContinuePrompt.cs │ │ │ │ │ │ ├── FinishGame.cs │ │ │ │ │ │ ├── GameProgress.cs │ │ │ │ │ │ ├── PlayerAttack.cs │ │ │ │ │ │ ├── PlayerSnapshop.cs │ │ │ │ │ │ ├── Responses/ │ │ │ │ │ │ │ ├── CommandResonse.cs │ │ │ │ │ │ │ ├── Confirmation.cs │ │ │ │ │ │ │ └── GameResponse.cs │ │ │ │ │ │ ├── TurnStarted.cs │ │ │ │ │ │ └── readme.md │ │ │ │ │ ├── Properties/ │ │ │ │ │ │ └── AssemblyInfo.cs │ │ │ │ │ └── project.json │ │ │ │ └── CardBattle.sln │ │ │ ├── src/ │ │ │ │ ├── SystemAsync/ │ │ │ │ │ ├── AsyncAction.cs │ │ │ │ │ ├── AsyncDisposable.cs │ │ │ │ │ ├── AsyncEventExtensions.cs │ │ │ │ │ ├── AsyncExtensions.cs │ │ │ │ │ ├── AsyncHandler.cs │ │ │ │ │ ├── AsyncHandlerList.cs │ │ │ │ │ ├── IAsyncDisposable.cs │ │ │ │ │ ├── IAsyncEvent.cs │ │ │ │ │ ├── Properties/ │ │ │ │ │ │ └── AssemblyInfo.cs │ │ │ │ │ ├── SynchronizationContextExtensions.cs │ │ │ │ │ ├── SystemAsync.csproj │ │ │ │ │ └── project.json │ │ │ │ └── TaskLibrary.Channels/ │ │ │ │ ├── AsyncActionList.cs │ │ │ │ ├── Backport/ │ │ │ │ │ ├── Disposable.cs │ │ │ │ │ └── EnumerableEx.cs │ │ │ │ ├── CancellableReceiver.cs │ │ │ │ ├── Channel.cs │ │ │ │ ├── DispatcherChannel.cs │ │ │ │ ├── DistributiveChannel.cs │ │ │ │ ├── FilterChannel.cs │ │ │ │ ├── Holder.cs │ │ │ │ ├── IReceiver.cs │ │ │ │ ├── IResponsiveMessage.cs │ │ │ │ ├── ISender.cs │ │ │ │ ├── InvocationMode.cs │ │ │ │ ├── LoggingChannel.cs │ │ │ │ ├── Properties/ │ │ │ │ │ └── AssemblyInfo.cs │ │ │ │ ├── RecordedResponse.cs │ │ │ │ ├── ReplicableChannel.cs │ │ │ │ ├── TaskLibrary.Channels.csproj │ │ │ │ ├── TypeSwitchChannel.cs │ │ │ │ ├── project.json │ │ │ │ └── readme.md │ │ │ └── tests/ │ │ │ └── TaskLibrary.Channels.Test/ │ │ │ ├── Helper.cs │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── TaskLibrary.Channels.Test.csproj │ │ │ ├── TestChannel.cs │ │ │ ├── TestData/ │ │ │ │ └── Message.cs │ │ │ ├── TestDispatcherChannel.cs │ │ │ ├── TestDistributiveChannel.cs │ │ │ ├── TestLoggingChannel.cs │ │ │ ├── TestReplicableChannel.cs │ │ │ └── project.json │ │ ├── CompilerPlatform/ │ │ │ └── ConsoleApplication1/ │ │ │ ├── ConsoleApplication1/ │ │ │ │ ├── App.config │ │ │ │ ├── ConsoleApplication1.csproj │ │ │ │ ├── Program.cs │ │ │ │ ├── Properties/ │ │ │ │ │ └── AssemblyInfo.cs │ │ │ │ ├── PropertyChanged.cs │ │ │ │ ├── Record.cs │ │ │ │ ├── TypeAlias.cs │ │ │ │ └── packages.config │ │ │ └── ConsoleApplication1.sln │ │ ├── DevsumiOpenJam/ │ │ │ ├── DevsumiOpenJam.sln │ │ │ ├── global.json │ │ │ └── src/ │ │ │ └── TwitterBot/ │ │ │ ├── Class1.cs │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── TwitterBot.xproj │ │ │ └── project.json │ │ ├── GoodCode/ │ │ │ ├── GoodCode.sln │ │ │ ├── readme.md │ │ │ └── src/ │ │ │ ├── AsyncSample/ │ │ │ │ ├── AsyncSample.csproj │ │ │ │ └── Program.cs │ │ │ ├── IteratorSample/ │ │ │ │ ├── Enumerable.cs │ │ │ │ ├── IteratorSample.csproj │ │ │ │ ├── Program.cs │ │ │ │ └── UseSequence.cs │ │ │ ├── LinqSample/ │ │ │ │ ├── InputOutput.cs │ │ │ │ ├── LinqSample.csproj │ │ │ │ └── Program.cs │ │ │ ├── NullabilitySample/ │ │ │ │ ├── NullCoalescing.cs │ │ │ │ ├── NullConditional.cs │ │ │ │ ├── NullError.cs │ │ │ │ ├── NullabilitySample.csproj │ │ │ │ ├── Program.cs │ │ │ │ └── WhatsNullable.cs │ │ │ └── PropertySample/ │ │ │ ├── Csharp1.cs │ │ │ ├── Csharp2.cs │ │ │ ├── Csharp3.cs │ │ │ ├── Csharp登場以前.cs │ │ │ ├── ImmutableCsharp5.cs │ │ │ ├── ImmutableCsharp6.cs │ │ │ ├── ImmutableCsharp7.cs │ │ │ ├── Program.cs │ │ │ └── PropertySample.csproj │ │ ├── NetStandard/ │ │ │ ├── ClassLibraryAndroid/ │ │ │ │ ├── Class1.cs │ │ │ │ ├── ClassLibraryAndroid.csproj │ │ │ │ ├── Properties/ │ │ │ │ │ └── AssemblyInfo.cs │ │ │ │ ├── Resources/ │ │ │ │ │ ├── AboutResources.txt │ │ │ │ │ ├── Resource.Designer.cs │ │ │ │ │ └── Values/ │ │ │ │ │ └── Strings.xml │ │ │ │ └── packages.config │ │ │ ├── ClassLibraryImports/ │ │ │ │ ├── Class1.cs │ │ │ │ ├── ClassLibraryImports.csproj │ │ │ │ ├── Properties/ │ │ │ │ │ └── AssemblyInfo.cs │ │ │ │ └── project.json │ │ │ ├── ClassLibraryNet35/ │ │ │ │ ├── Class1.cs │ │ │ │ ├── ClassLibraryNet35.csproj │ │ │ │ └── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── ClassLibraryNet45/ │ │ │ │ ├── Class1.cs │ │ │ │ ├── ClassLibraryNet45.csproj │ │ │ │ ├── Properties/ │ │ │ │ │ └── AssemblyInfo.cs │ │ │ │ └── packages.config │ │ │ ├── ClassLibraryNetCore/ │ │ │ │ ├── Class1.cs │ │ │ │ ├── ClassLibraryNetCore.xproj │ │ │ │ ├── Properties/ │ │ │ │ │ └── AssemblyInfo.cs │ │ │ │ └── project.json │ │ │ ├── ClassLibraryProfileBased/ │ │ │ │ ├── Class1.cs │ │ │ │ ├── ClassLibraryProfileBased.csproj │ │ │ │ ├── Properties/ │ │ │ │ │ └── AssemblyInfo.cs │ │ │ │ └── project.json │ │ │ ├── ClassLibraryStandardBased/ │ │ │ │ ├── Class1.cs │ │ │ │ ├── ClassLibraryStandardBased.csproj │ │ │ │ ├── Properties/ │ │ │ │ │ └── AssemblyInfo.cs │ │ │ │ └── project.json │ │ │ ├── ConsoleApplicationNet46/ │ │ │ │ ├── App.config │ │ │ │ ├── ConsoleApplicationNet46.csproj │ │ │ │ ├── Program.cs │ │ │ │ ├── Properties/ │ │ │ │ │ └── AssemblyInfo.cs │ │ │ │ └── packages.config │ │ │ └── NetStandard.sln │ │ ├── PrivateField/ │ │ │ ├── ErroneousCodes/ │ │ │ │ ├── App.config │ │ │ │ ├── DefiniteAssignement.cs │ │ │ │ ├── ErroneousCodes.csproj │ │ │ │ ├── ManagedPointer.cs │ │ │ │ ├── Program.cs │ │ │ │ ├── Properties/ │ │ │ │ │ └── AssemblyInfo.cs │ │ │ │ └── RecursiveLayout.cs │ │ │ ├── PrivateField.ConsoleApp/ │ │ │ │ ├── App.config │ │ │ │ ├── PrivateField.ConsoleApp.csproj │ │ │ │ ├── Program.cs │ │ │ │ └── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── PrivateField.Shared/ │ │ │ │ ├── DefiniteAssignment.cs │ │ │ │ ├── ManagedPointer.cs │ │ │ │ ├── PrivateField.Shared.projitems │ │ │ │ ├── PrivateField.Shared.shproj │ │ │ │ └── RecursiveLayout.cs │ │ │ ├── PrivateField.StandardLib/ │ │ │ │ └── PrivateField.StandardLib.csproj │ │ │ └── PrivateField.sln │ │ └── Unicode/ │ │ ├── ConsoleApplication1/ │ │ │ ├── AllCharactersInUnicodeData.cs │ │ │ ├── CharacterLength.cs │ │ │ ├── ComparisonWithSystemString.cs │ │ │ ├── CompatibleWithBstr.cs │ │ │ ├── ConsoleApplication1.csproj │ │ │ ├── DecodeSample.cs │ │ │ ├── DualEncoding.cs │ │ │ ├── GraphemeIdentifiers.cs │ │ │ ├── NoAllocation.cs │ │ │ ├── Performance.cs │ │ │ ├── Program.cs │ │ │ └── SurrogatePair.cs │ │ ├── Unicode.sln │ │ ├── UnitTestUtfString/ │ │ │ ├── CharacterInfo.cs │ │ │ ├── TestData.cs │ │ │ ├── TestSlicesUtf8String.cs │ │ │ ├── TestString.cs │ │ │ ├── UnitTestUtfString.csproj │ │ │ └── UnitTestUtfString.nuget.props │ │ └── UtfString/ │ │ ├── ArrayImplementation/ │ │ │ ├── Utf16/ │ │ │ │ ├── Decoder.cs │ │ │ │ ├── Index.cs │ │ │ │ ├── IndexEnumerable.cs │ │ │ │ ├── String.cs │ │ │ │ └── StringEnumerator.cs │ │ │ ├── Utf8/ │ │ │ │ ├── Decoder.cs │ │ │ │ ├── Index.cs │ │ │ │ ├── IndexEnumerable.cs │ │ │ │ ├── String.cs │ │ │ │ └── StringEnumerator.cs │ │ │ └── readme.md │ │ ├── CodePoint.cs │ │ ├── Constants.cs │ │ ├── DebugInterfaces.cs │ │ ├── DualEncoding/ │ │ │ ├── ArrayAccessor.cs │ │ │ ├── Decoder.cs │ │ │ └── String.cs │ │ ├── Generic/ │ │ │ ├── ArrayAccessor.cs │ │ │ ├── Decoder.cs │ │ │ ├── String.cs │ │ │ └── readme.md │ │ ├── Slices/ │ │ │ ├── Decoder.cs │ │ │ ├── ReadOnlySpan.cs │ │ │ └── Utf8String.cs │ │ ├── Utf16/ │ │ │ ├── ArrayAccessor.cs │ │ │ ├── Decoder.cs │ │ │ └── String.cs │ │ ├── Utf32/ │ │ │ ├── ArrayAccessor.cs │ │ │ ├── Decoder.cs │ │ │ └── String.cs │ │ ├── Utf8/ │ │ │ ├── ArrayAccessor.cs │ │ │ ├── Decoder.cs │ │ │ └── String.cs │ │ ├── UtfString.csproj │ │ └── readme.md │ ├── 2017/ │ │ ├── BitFieldsSample/ │ │ │ ├── BitFieldsSample.csproj │ │ │ ├── BitFieldsSample.sln │ │ │ ├── DoubleView.BitFields.cs │ │ │ ├── DoubleView.cs │ │ │ ├── Program.cs │ │ │ ├── Rgb555.BitFields.cs │ │ │ ├── Rgb555.cs │ │ │ ├── SingleView.BitFields.cs │ │ │ └── SingleView.cs │ │ ├── BitOperations/ │ │ │ ├── BitOperations/ │ │ │ │ ├── BitOperations.csproj │ │ │ │ ├── Bits.cs │ │ │ │ ├── Bits_T.cs │ │ │ │ ├── Bytes16.cs │ │ │ │ ├── IBits.cs │ │ │ │ ├── PrimitiveBitOperators.cs │ │ │ │ ├── Program.cs │ │ │ │ └── SBitOperator.cs │ │ │ ├── BitOperations.sln │ │ │ └── GenericBits/ │ │ │ ├── Bits.cs │ │ │ ├── GenericBits.csproj │ │ │ ├── Program.cs │ │ │ ├── Sample1.cs │ │ │ └── Sample2.cs │ │ ├── BufferPerformance/ │ │ │ ├── BufferPerformance/ │ │ │ │ ├── BufferPerformance.csproj │ │ │ │ ├── Buffers/ │ │ │ │ │ ├── ArraySpan.cs │ │ │ │ │ ├── BufferA.cs │ │ │ │ │ ├── BufferB.cs │ │ │ │ │ ├── BufferC.cs │ │ │ │ │ ├── BufferD.cs │ │ │ │ │ ├── BufferE.cs │ │ │ │ │ ├── IBuffer.cs │ │ │ │ │ ├── IByteSpan.cs │ │ │ │ │ └── PointerSpan.cs │ │ │ │ └── Program.cs │ │ │ └── BufferPerformance.sln │ │ ├── Csharp7/ │ │ │ ├── ConsoleApp1/ │ │ │ │ ├── 01 Tuples/ │ │ │ │ │ ├── 01.cs │ │ │ │ │ ├── 02.cs │ │ │ │ │ ├── 03.cs │ │ │ │ │ ├── 04 Extensions-1.cs │ │ │ │ │ ├── 04 Extensions-2.cs │ │ │ │ │ ├── 04 Extensions-3.cs │ │ │ │ │ ├── 05 Performance.cs │ │ │ │ │ ├── 06 Implementation.cs │ │ │ │ │ └── 07 KnownIssue.cs │ │ │ │ ├── 01-1 ExpressionBodied/ │ │ │ │ │ ├── 01.cs │ │ │ │ │ └── 02.cs │ │ │ │ ├── 02 Patterns/ │ │ │ │ │ ├── 01.cs │ │ │ │ │ ├── 02.cs │ │ │ │ │ ├── 03.cs │ │ │ │ │ ├── 04.cs │ │ │ │ │ ├── 05.cs │ │ │ │ │ ├── 06.cs │ │ │ │ │ ├── 07.cs │ │ │ │ │ ├── 08-0 Node.cs │ │ │ │ │ ├── 08-1 virtual.cs │ │ │ │ │ └── 08-2 pattern.cs │ │ │ │ ├── 02-1 ThrowExpression/ │ │ │ │ │ ├── 01.cs │ │ │ │ │ └── 02.cs │ │ │ │ ├── 03 LocalFunctions/ │ │ │ │ │ ├── 00.csx │ │ │ │ │ ├── 01.cs │ │ │ │ │ ├── 02.cs │ │ │ │ │ ├── 03.cs │ │ │ │ │ └── 04 Performance.cs │ │ │ │ ├── 04 Ref/ │ │ │ │ │ ├── 01.cs │ │ │ │ │ ├── 02.cs │ │ │ │ │ ├── 03.cs │ │ │ │ │ ├── 04 Unsafe.cs │ │ │ │ │ └── 05 SystemMemory.cs │ │ │ │ ├── 05 GeneralizedAsync/ │ │ │ │ │ ├── 01.cs │ │ │ │ │ ├── 02.cs │ │ │ │ │ └── Performance.cs │ │ │ │ ├── 06 Digits/ │ │ │ │ │ ├── 01.cs │ │ │ │ │ └── 02.cs │ │ │ │ ├── 07 Future/ │ │ │ │ │ ├── 01 cs71.cs │ │ │ │ │ ├── 02 cs72.cs │ │ │ │ │ └── 02 cs7X.cs │ │ │ │ ├── App.config │ │ │ │ ├── ConsoleApp1.csproj │ │ │ │ ├── Interop.cs │ │ │ │ ├── Program.cs │ │ │ │ └── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ └── Csharp7.sln │ │ ├── Csharp7_2-0902/ │ │ │ ├── ConsoleApp2_6_0/ │ │ │ │ ├── ConsoleApp2_6_0.csproj │ │ │ │ └── Program.cs │ │ │ ├── ConsoleAppRefReadonly/ │ │ │ │ ├── ConsoleAppRefReadonly.csproj │ │ │ │ ├── Program.cs │ │ │ │ └── StackHashSet.cs │ │ │ └── NewLangFeatures.sln │ │ ├── Csharp7_2-1012/ │ │ │ ├── ClassLibrary1/ │ │ │ │ ├── ClassLibrary1.csproj │ │ │ │ ├── PrivateProtected.cs │ │ │ │ └── PrivateProtectedOrder.cs │ │ │ ├── ConsoleApp1/ │ │ │ │ ├── ConditionalRefOperator.cs │ │ │ │ ├── ConsoleApp1.csproj │ │ │ │ ├── DigitSeparator.cs │ │ │ │ ├── NonTrailingNamedArguments.cs │ │ │ │ ├── PrivateProtected.cs │ │ │ │ ├── Program.cs │ │ │ │ ├── ReadOnlyStruct.cs │ │ │ │ ├── RefExtensionRefOperator.cs │ │ │ │ ├── RefReadonly.cs │ │ │ │ ├── RefStruct.cs │ │ │ │ ├── SafeStackalloc.cs │ │ │ │ ├── SpanSafety.cs │ │ │ │ └── SpanSample.cs │ │ │ └── Csharp7_2-1012.sln │ │ ├── EmbeddedSource/ │ │ │ ├── .gitignore │ │ │ ├── ClassLibrary1/ │ │ │ │ ├── Class1.cs │ │ │ │ ├── Class2.cs │ │ │ │ ├── ClassLibrary1.csproj │ │ │ │ └── Point.cs │ │ │ ├── ConsoleApp1/ │ │ │ │ ├── ConsoleApp1.csproj │ │ │ │ └── Program.cs │ │ │ ├── EmbeddedSource.sln │ │ │ ├── Lib/ │ │ │ │ ├── a.cs │ │ │ │ ├── b.cs │ │ │ │ ├── build.ps1 │ │ │ │ ├── c.cs │ │ │ │ └── d.cs │ │ │ ├── NuGet.Config │ │ │ └── readme.md │ │ ├── InOperatorDifferentAssemly/ │ │ │ ├── ClassLibrary1/ │ │ │ │ ├── Class1.cs │ │ │ │ └── ClassLibrary1.csproj │ │ │ ├── ConsoleApp1/ │ │ │ │ ├── ConsoleApp1.csproj │ │ │ │ └── Program.cs │ │ │ └── InOperatorDifferentAssemly.sln │ │ ├── InlineExpansion/ │ │ │ ├── Generics/ │ │ │ │ ├── 03 Generics.csproj │ │ │ │ ├── BenchmarkCode.cs │ │ │ │ ├── Program.cs │ │ │ │ └── Target.cs │ │ │ ├── InlineExpansion.sln │ │ │ ├── InlinedOrNot/ │ │ │ │ ├── 01 InlinedOrNot.csproj │ │ │ │ ├── BenchmarkCode.cs │ │ │ │ ├── Program.cs │ │ │ │ └── Target.cs │ │ │ ├── ValueTypeGenerics/ │ │ │ │ ├── 04 ValueTypeGenerics.csproj │ │ │ │ ├── BenchmarkCode.cs │ │ │ │ ├── IGroup.cs │ │ │ │ ├── Program.cs │ │ │ │ └── Target.cs │ │ │ └── VirtualCall/ │ │ │ ├── 02 VirtualCall.csproj │ │ │ ├── BenchmarkCode.cs │ │ │ ├── Program.cs │ │ │ └── Target.cs │ │ ├── IntTemplateParameter/ │ │ │ ├── IntTemplateParameter/ │ │ │ │ ├── ConstantInt.cs │ │ │ │ ├── ConstantInt.tt │ │ │ │ ├── GaloisField.cs │ │ │ │ ├── GaloisField_N.cs │ │ │ │ ├── IConstant.cs │ │ │ │ ├── IntTemplateParameter.csproj │ │ │ │ ├── Program.cs │ │ │ │ └── readme.md │ │ │ └── IntTemplateParameter.sln │ │ ├── ManualResourceManagement/ │ │ │ ├── DisposePattern/ │ │ │ │ ├── 02 DisposePattern.csproj │ │ │ │ ├── Counter.cs │ │ │ │ ├── IReferenceCoutable.cs │ │ │ │ ├── Program.cs │ │ │ │ └── Tests/ │ │ │ │ ├── 01 ManualDispose.cs │ │ │ │ ├── 02 Finalizer.cs │ │ │ │ ├── 03 StructCantHaveFinalizer.cs │ │ │ │ ├── 04 ReferenceCount.cs │ │ │ │ ├── Constants.cs │ │ │ │ ├── SampleDisopsable.cs │ │ │ │ ├── SampleDisopsableStruct.cs │ │ │ │ └── SampleReferenceCount.cs │ │ │ ├── HeapAllocation/ │ │ │ │ ├── 01 HeapAllocation.csproj │ │ │ │ ├── Allocation.cs │ │ │ │ ├── AllocationBenchmark.cs │ │ │ │ ├── Allocators/ │ │ │ │ │ ├── CasPool .cs │ │ │ │ │ ├── IAllocator.cs │ │ │ │ │ ├── Interop.cs │ │ │ │ │ ├── LocalPool.cs │ │ │ │ │ ├── LockPool.cs │ │ │ │ │ └── MallocAllocator.cs │ │ │ │ ├── Data/ │ │ │ │ │ ├── ClassPoint.cs │ │ │ │ │ ├── PointerPoint.cs │ │ │ │ │ └── StructPoint.cs │ │ │ │ ├── Program.cs │ │ │ │ └── Test.cs │ │ │ └── ManualResourceManagement.sln │ │ ├── ModalDialogSample/ │ │ │ ├── App.xaml │ │ │ ├── App.xaml.cs │ │ │ ├── IResultDialog.cs │ │ │ ├── MainWindow.xaml │ │ │ ├── MainWindow.xaml.cs │ │ │ ├── ModalDialogSample.csproj │ │ │ ├── ModalDialogSample.sln │ │ │ ├── Window1.xaml │ │ │ └── Window1.xaml.cs │ │ ├── NewCsproj/ │ │ │ ├── NewCsproj/ │ │ │ │ ├── ClassLibraryLink/ │ │ │ │ │ └── ClassLibraryLink.csproj │ │ │ │ ├── ClassLibraryMultiTarget/ │ │ │ │ │ ├── Class1.cs │ │ │ │ │ └── ClassLibraryMultiTarget.csproj │ │ │ │ ├── ClassLibraryNet35/ │ │ │ │ │ ├── Class1.cs │ │ │ │ │ └── ClassLibraryNet35.csproj │ │ │ │ ├── ClassLibraryStd14/ │ │ │ │ │ ├── Class1.cs │ │ │ │ │ └── ClassLibraryStd14.csproj │ │ │ │ ├── ConsoleAppCore11/ │ │ │ │ │ ├── ConsoleAppCore11.csproj │ │ │ │ │ └── Program.cs │ │ │ │ ├── ConsoleAppNet35/ │ │ │ │ │ ├── ConsoleAppNet35.csproj │ │ │ │ │ └── Program.cs │ │ │ │ └── WpfAppNet47/ │ │ │ │ ├── App.xaml │ │ │ │ ├── App.xaml.cs │ │ │ │ ├── MainWindow.xaml │ │ │ │ ├── MainWindow.xaml.cs │ │ │ │ └── WpfAppNet47.csproj │ │ │ ├── NewCsproj.sln │ │ │ └── OldCsproj/ │ │ │ ├── ClassLibraryNet35/ │ │ │ │ ├── Class1.cs │ │ │ │ ├── ClassLibraryNet35.csproj │ │ │ │ └── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── ConsoleAppNet35/ │ │ │ │ ├── ConsoleAppNet35.csproj │ │ │ │ ├── Program.cs │ │ │ │ └── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ └── WpfAppNet47/ │ │ │ ├── App.config │ │ │ ├── App.xaml │ │ │ ├── App.xaml.cs │ │ │ ├── MainWindow.xaml │ │ │ ├── MainWindow.xaml.cs │ │ │ ├── Properties/ │ │ │ │ ├── AssemblyInfo.cs │ │ │ │ ├── Resources.Designer.cs │ │ │ │ ├── Resources.resx │ │ │ │ ├── Settings.Designer.cs │ │ │ │ └── Settings.settings │ │ │ └── WpfAppNet47.csproj │ │ ├── PackageReference/ │ │ │ ├── ClassLibrary/ │ │ │ │ ├── Class1.cs │ │ │ │ └── ClassLibrary.csproj │ │ │ ├── ClassLibrary.A/ │ │ │ │ └── ClassLibrary.A.csproj │ │ │ ├── ClassLibrary.B/ │ │ │ │ └── ClassLibrary.B.csproj │ │ │ ├── ClassLibraryDependsOnA/ │ │ │ │ ├── Class1.cs │ │ │ │ └── ClassLibraryDependsOnA.csproj │ │ │ ├── ConsoleApp1/ │ │ │ │ ├── ConsoleApp1.csproj │ │ │ │ └── Program.cs │ │ │ ├── NuGet.config │ │ │ ├── PackageReference.sln │ │ │ ├── build.ps1 │ │ │ ├── fig/ │ │ │ │ └── fig.pptx │ │ │ └── readme.md │ │ ├── PropertyAccessor/ │ │ │ ├── PropertyAccessor/ │ │ │ │ ├── AccessorBenchmark.cs │ │ │ │ ├── Accessors/ │ │ │ │ │ ├── CustomHashTableAccessor.cs │ │ │ │ │ ├── DictionaryAccessor.cs │ │ │ │ │ ├── EachCodeGenerator.cs │ │ │ │ │ ├── ImmutableDictionaryAccessor.cs │ │ │ │ │ ├── SortedDictionaryAccessor.cs │ │ │ │ │ ├── SortedListAccessor.cs │ │ │ │ │ ├── SwitchAccessor.cs │ │ │ │ │ └── SwitchCodeGenerator.cs │ │ │ │ ├── Extensions.cs │ │ │ │ ├── IAccessor.cs │ │ │ │ ├── Program.cs │ │ │ │ ├── PropertyAccessor.csproj │ │ │ │ └── SampleData/ │ │ │ │ ├── Item.cs │ │ │ │ └── Point.cs │ │ │ └── PropertyAccessor.sln │ │ ├── Roslyn2_6_0PossiblyBug/ │ │ │ ├── ConsoleApp1/ │ │ │ │ ├── ConsoleApp1.csproj │ │ │ │ └── Program.cs │ │ │ └── ConsoleApp1.sln │ │ ├── SpanAsSafePointer/ │ │ │ ├── ConsoleApp1/ │ │ │ │ ├── ConsoleApp1.csproj │ │ │ │ ├── Point.cs │ │ │ │ ├── Program.cs │ │ │ │ ├── RefExtensions/ │ │ │ │ │ └── Before.cs │ │ │ │ ├── Safe/ │ │ │ │ │ └── Stream.cs │ │ │ │ ├── SaveLoadBenchmark.cs │ │ │ │ ├── SaveLoadTest.cs │ │ │ │ ├── SpanBase/ │ │ │ │ │ └── Stream.cs │ │ │ │ └── Unsafe/ │ │ │ │ └── Stream.cs │ │ │ └── SpanAsSafePointer.sln │ │ ├── TupleMutableStruct/ │ │ │ ├── TupleMutableStruct/ │ │ │ │ ├── Data/ │ │ │ │ │ ├── Circular.cs │ │ │ │ │ ├── Point.cs │ │ │ │ │ └── VirtualPoint.cs │ │ │ │ ├── MemoryLayout/ │ │ │ │ │ ├── Benchmark.cs │ │ │ │ │ ├── PointerAdd.cs │ │ │ │ │ ├── Program.cs │ │ │ │ │ ├── RandomExtensions.cs │ │ │ │ │ ├── RefReturns.cs │ │ │ │ │ ├── SafeAdd.cs │ │ │ │ │ ├── Test.cs │ │ │ │ │ └── Vector.cs │ │ │ │ ├── Program.cs │ │ │ │ ├── StructProperties/ │ │ │ │ │ ├── GetSet.cs │ │ │ │ │ └── RefReturns.cs │ │ │ │ ├── TupleMutableStruct.csproj │ │ │ │ ├── Usage/ │ │ │ │ │ ├── BindableBase.cs │ │ │ │ │ ├── Field.cs │ │ │ │ │ ├── LooselyTyped.cs │ │ │ │ │ ├── Program.cs │ │ │ │ │ └── Tuple.cs │ │ │ │ ├── ValueObject/ │ │ │ │ │ ├── MutableClass.cs │ │ │ │ │ └── MutableStruct.cs │ │ │ │ └── ValueTuple.cs │ │ │ └── TupleMutableStruct.sln │ │ ├── TypeRepositoryBenchmarks/ │ │ │ ├── ByteToLongBenchmark/ │ │ │ │ ├── ByteToLongBenchmark.cs │ │ │ │ ├── ByteToLongBenchmark.csproj │ │ │ │ └── Program.cs │ │ │ ├── DictionaryBenchmark/ │ │ │ │ ├── CharNode.cs │ │ │ │ ├── DictionaryBenchmark.cs │ │ │ │ ├── DictionaryBenchmark.csproj │ │ │ │ ├── Extensions.cs │ │ │ │ ├── FixedDictionary.cs │ │ │ │ ├── FixedDictionary2.cs │ │ │ │ ├── LongNode.cs │ │ │ │ ├── Program.cs │ │ │ │ └── TestData.cs │ │ │ ├── Grisu3DoubleConversion/ │ │ │ │ ├── DiyFp.cs │ │ │ │ ├── DoubleConversion.cs │ │ │ │ ├── DoubleConversionBenchmark.cs │ │ │ │ ├── DoubleConversionTest.cs │ │ │ │ ├── DoubleView.cs │ │ │ │ ├── FastDtoaMode.cs │ │ │ │ ├── Grisu3DoubleConversion.csproj │ │ │ │ ├── NumberStringBuffer.cs │ │ │ │ ├── PowersOfTenCache.cs │ │ │ │ ├── Program.cs │ │ │ │ ├── SingleView.cs │ │ │ │ └── TestData.cs │ │ │ ├── OptionalArrayBenchmark/ │ │ │ │ ├── BitArray64.cs │ │ │ │ ├── Optional.cs │ │ │ │ ├── OptionalArray.cs │ │ │ │ ├── OptionalArrayBenchmark.cs │ │ │ │ ├── OptionalArrayBenchmark.csproj │ │ │ │ └── Program.cs │ │ │ ├── ParseIntBnechmark/ │ │ │ │ ├── ParseIntBenchmark.cs │ │ │ │ ├── ParseIntBnechmark.csproj │ │ │ │ └── Program.cs │ │ │ ├── SequenceBenchmark/ │ │ │ │ ├── Program.cs │ │ │ │ ├── SequenceBenchmark.cs │ │ │ │ └── SequenceBenchmark.csproj │ │ │ ├── StackallocDistinctBenchmark/ │ │ │ │ ├── ArrayHashSet.cs │ │ │ │ ├── DistinctBenchmark.cs │ │ │ │ ├── IntComp.cs │ │ │ │ ├── Program.cs │ │ │ │ ├── StackHashSet.cs │ │ │ │ └── StackallocDistinctBenchmark.csproj │ │ │ ├── TypeRepositoryBenchmarks.sln │ │ │ ├── Utf8SearchBenchmark/ │ │ │ │ ├── BoyerMoore.cs │ │ │ │ ├── Program.cs │ │ │ │ ├── StringComparisonBenchmark.cs │ │ │ │ ├── Utf8SearchBenchmark.cs │ │ │ │ └── Utf8SearchBenchmark.csproj │ │ │ └── UtfCompareBenchmark/ │ │ │ ├── Program.cs │ │ │ ├── StringBenchmark.cs │ │ │ ├── StringExtensions.cs │ │ │ ├── StringToUtf8Byte.cs │ │ │ └── UtfCompareBenchmark.csproj │ │ ├── UnionTypes/ │ │ │ ├── UnionTypes/ │ │ │ │ ├── Generator.cs │ │ │ │ ├── Generator.partial.cs │ │ │ │ ├── Generator.tt │ │ │ │ ├── IUnion.cs │ │ │ │ ├── Program.cs │ │ │ │ ├── Runner.cs │ │ │ │ ├── Runner.partial.cs │ │ │ │ ├── Runner.tt │ │ │ │ ├── Union1.cs │ │ │ │ ├── Union2.cs │ │ │ │ ├── Union3.cs │ │ │ │ ├── Union4.cs │ │ │ │ ├── Union5.cs │ │ │ │ ├── UnionTypes.csproj │ │ │ │ └── Vector.cs │ │ │ └── UnionTypes.sln │ │ ├── UnsafeRefReturns/ │ │ │ ├── UnsafeRefReturns/ │ │ │ │ ├── AccessViolation.cs │ │ │ │ ├── Color.cs │ │ │ │ ├── Point3D.Managed.cs │ │ │ │ ├── Point3D.Pointer.cs │ │ │ │ ├── UnsafeRefReturns.csproj │ │ │ │ └── ValueNull.cs │ │ │ └── UnsafeRefReturns.sln │ │ └── Ạṇạḷỵẓẹṛ/ │ │ ├── Ạṇạḷỵẓẹṛ/ │ │ │ ├── Ạṇạḷỵẓẹṛ/ │ │ │ │ ├── Resources.Designer.cs │ │ │ │ ├── Resources.resx │ │ │ │ ├── tools/ │ │ │ │ │ ├── install.ps1 │ │ │ │ │ └── uninstall.ps1 │ │ │ │ ├── Ạṇạḷỵẓẹṛ.csproj │ │ │ │ ├── ẠṇạḷỵẓẹṛAnalyzer.cs │ │ │ │ └── ẠṇạḷỵẓẹṛCodeFixProvider.cs │ │ │ ├── Ạṇạḷỵẓẹṛ.Test/ │ │ │ │ ├── DataSource/ │ │ │ │ │ ├── result-schema.json │ │ │ │ │ └── ẠṇạḷỵẓẹṛUnitTests/ │ │ │ │ │ ├── EmptySource/ │ │ │ │ │ │ └── Source/ │ │ │ │ │ │ └── Class1.csx │ │ │ │ │ └── LowercaseLetters/ │ │ │ │ │ ├── Diagnostic/ │ │ │ │ │ │ └── Results.json │ │ │ │ │ ├── Expected/ │ │ │ │ │ │ └── Class1.csx │ │ │ │ │ └── Source/ │ │ │ │ │ └── Class1.csx │ │ │ │ ├── Helpers/ │ │ │ │ │ ├── CodeFixVerifier.Helper.cs │ │ │ │ │ ├── DiagnosticResult.cs │ │ │ │ │ └── DiagnosticVerifier.Helper.cs │ │ │ │ ├── Verifiers/ │ │ │ │ │ ├── CodeFixVerifier.cs │ │ │ │ │ ├── ConventionCodeFixVerifier.cs │ │ │ │ │ └── DiagnosticVerifier.cs │ │ │ │ ├── Ạṇạḷỵẓẹṛ.Test.csproj │ │ │ │ └── ẠṇạḷỵẓẹṛUnitTests.cs │ │ │ └── Ạṇạḷỵẓẹṛ.Vsix/ │ │ │ ├── source.extension.vsixmanifest │ │ │ └── Ạṇạḷỵẓẹṛ.Vsix.csproj │ │ └── Ạṇạḷỵẓẹṛ.sln │ ├── 2018/ │ │ ├── AsyncInternal/ │ │ │ ├── AsyncInternal.csproj │ │ │ ├── AsyncInternal.sln │ │ │ ├── AwaitCodeGeneration.cs │ │ │ ├── AwaitOperator.cs │ │ │ ├── CallbackAsync.cs │ │ │ ├── Data.cs │ │ │ ├── Program.cs │ │ │ └── Synchronous.cs │ │ ├── CachedAsync/ │ │ │ ├── CachedAsync/ │ │ │ │ ├── AsyncOperation.cs │ │ │ │ ├── CachedAsync.csproj │ │ │ │ ├── FirstToTaskObserver.cs │ │ │ │ ├── Program.cs │ │ │ │ └── TimerLoop.cs │ │ │ ├── CachedAsync.sln │ │ │ └── readme.md │ │ ├── Cs8InVs2019P1/ │ │ │ ├── AsyncStreams.cs │ │ │ ├── Cs8InVs2019P1.csproj │ │ │ ├── Cs8InVs2019P1.sln │ │ │ ├── InterpolatedVerbatimStrings.cs │ │ │ ├── NRT.cs │ │ │ ├── NullCoalescingAssignment.cs │ │ │ ├── Range2D.cs │ │ │ ├── RangeAndIndex.cs │ │ │ └── ThrowHelper.cs │ │ ├── Csharp7_3-0309/ │ │ │ ├── ConsoleApp1/ │ │ │ │ ├── BackingFieldAttribute/ │ │ │ │ │ └── Program.cs │ │ │ │ ├── ConsoleApp1.csproj │ │ │ │ ├── Constraints/ │ │ │ │ │ ├── Point.cs │ │ │ │ │ ├── SystemDelegate.cs │ │ │ │ │ ├── SystemEnum.cs │ │ │ │ │ └── Unmanaged.cs │ │ │ │ ├── ExpressionVariables/ │ │ │ │ │ ├── BaseInitializer.cs │ │ │ │ │ ├── FieldInitializer.cs │ │ │ │ │ ├── QueryExpressions.cs │ │ │ │ │ ├── Table.cs │ │ │ │ │ └── ThisInitializer.cs │ │ │ │ ├── Fixed/ │ │ │ │ │ ├── CustomFixed.cs │ │ │ │ │ └── MovableFixedBuffer.cs │ │ │ │ ├── OverloadResolution/ │ │ │ │ │ ├── Constraints.cs │ │ │ │ │ ├── DummyParameter.cs │ │ │ │ │ ├── Extensions.cs │ │ │ │ │ ├── FirstOrNull.cs │ │ │ │ │ ├── MethodReturn.cs │ │ │ │ │ ├── Refness.cs │ │ │ │ │ └── Static.cs │ │ │ │ ├── Program.cs │ │ │ │ ├── Ref/ │ │ │ │ │ ├── Node.cs │ │ │ │ │ ├── Program.cs │ │ │ │ │ └── RefArrayEnumerable.cs │ │ │ │ ├── Stackalloc/ │ │ │ │ │ └── Program.cs │ │ │ │ └── TupleEquality/ │ │ │ │ └── Program.cs │ │ │ └── Csharp7_3-0309.sln │ │ ├── DotNetGlobalTools/ │ │ │ ├── .gitignore │ │ │ ├── DotNetGlobalTools.sln │ │ │ ├── csunzip/ │ │ │ │ ├── Program.cs │ │ │ │ └── csunzip.csproj │ │ │ ├── cszip/ │ │ │ │ ├── Program.cs │ │ │ │ └── cszip.csproj │ │ │ ├── install.bat │ │ │ ├── nuget.config │ │ │ ├── pack.bat │ │ │ ├── readme.md │ │ │ ├── sample.bat │ │ │ └── xstatic/ │ │ │ ├── Program.cs │ │ │ └── xstatic.csproj │ │ ├── EmojiIdentifier/ │ │ │ ├── identifier.md │ │ │ ├── readme.md │ │ │ ├── swift.en.md │ │ │ └── swift.md │ │ ├── GuardedDevirt/ │ │ │ ├── GuardedDevirt/ │ │ │ │ ├── A.cs │ │ │ │ ├── B.cs │ │ │ │ ├── CallBenchmark.cs │ │ │ │ ├── GuardedDevirt.csproj │ │ │ │ ├── I.cs │ │ │ │ └── Program.cs │ │ │ └── GuardedDevirt.sln │ │ ├── IOPerformance/ │ │ │ ├── App/ │ │ │ │ ├── App.csproj │ │ │ │ ├── DataBenchmark.cs │ │ │ │ ├── LineReader.cs │ │ │ │ ├── Program.cs │ │ │ │ └── Splitter.cs │ │ │ ├── Compare20And21/ │ │ │ │ ├── Compare20And21.csproj │ │ │ │ ├── DataBenchmark.cs │ │ │ │ └── Program.cs │ │ │ ├── IOPerformance.sln │ │ │ └── data/ │ │ │ ├── .gitignore │ │ │ └── data.py │ │ ├── MetricSpace/ │ │ │ ├── MetricSpace/ │ │ │ │ ├── Devirtualized1/ │ │ │ │ │ └── Euclidean.cs │ │ │ │ ├── Devirtualized2/ │ │ │ │ │ ├── Array1.cs │ │ │ │ │ └── Euclidean.cs │ │ │ │ ├── Devirtualized3/ │ │ │ │ │ ├── Arithmetic.cs │ │ │ │ │ ├── Chebyshev.cs │ │ │ │ │ ├── Euclidean.cs │ │ │ │ │ ├── FixedArray.cs │ │ │ │ │ └── Manhattan.cs │ │ │ │ ├── Instantiation/ │ │ │ │ │ └── Instantiation.cs │ │ │ │ ├── MetricSpace.csproj │ │ │ │ ├── NonGeneric/ │ │ │ │ │ └── Euclidean.cs │ │ │ │ └── Virtualized/ │ │ │ │ └── Euclidean.cs │ │ │ ├── MetricSpace.sln │ │ │ └── readme.md │ │ ├── NrtPreview09112018/ │ │ │ ├── Closure.cs │ │ │ ├── CurriedDelegate.cs │ │ │ ├── EarlyReturn.cs │ │ │ ├── ExplicitInterfaceMethod.cs │ │ │ ├── FieldInitializer.cs │ │ │ ├── NestedDerivedClass.cs │ │ │ ├── NonNullWhenNonNull.cs │ │ │ ├── NrtPreview09112018.csproj │ │ │ ├── NrtPreview09112018.sln │ │ │ ├── Switch.cs │ │ │ └── readme.md │ │ ├── PerformanceTips/ │ │ │ ├── ArrayDowncast/ │ │ │ │ ├── ArrayDowncast.csproj │ │ │ │ ├── ArrayDowncastBenchmark.cs │ │ │ │ └── Program.cs │ │ │ ├── ArrayEnumeration/ │ │ │ │ ├── ArrayEnumeration.csproj │ │ │ │ ├── ArrayWrapper.Array.cs │ │ │ │ ├── ArrayWrapper.IEnumerable.cs │ │ │ │ ├── ArrayWrapper.ImmutableArray.cs │ │ │ │ ├── ArrayWrapper.ReadOnlyCollection.cs │ │ │ │ ├── ArrayWrapper.Span.cs │ │ │ │ ├── ArrayWrapper.StructEnumerator.cs │ │ │ │ └── Program.cs │ │ │ ├── DefaultIsNull/ │ │ │ │ ├── DefaultIsNull.csproj │ │ │ │ ├── DefaultIsNullBenchmark.cs │ │ │ │ └── Program.cs │ │ │ ├── Directory.Build.props │ │ │ ├── DiscriminatedUnion/ │ │ │ │ ├── DiscriminatedUnion.csproj │ │ │ │ ├── Discriminator.cs │ │ │ │ ├── DiscriminatorField.cs │ │ │ │ ├── DiscriminatorFieldUnsafe.cs │ │ │ │ ├── IsMatching.cs │ │ │ │ ├── Program.cs │ │ │ │ └── UnionBenchmark.cs │ │ │ ├── EnumHasFlag/ │ │ │ │ ├── EnumHasFlag.csproj │ │ │ │ ├── EnumHasFlagBenchmark.cs │ │ │ │ └── Program.cs │ │ │ ├── Enumeration/ │ │ │ │ ├── Enumeration.csproj │ │ │ │ ├── EnumerationBenchmark.cs │ │ │ │ ├── EnumerationTest.cs │ │ │ │ ├── IFastEnumerator.cs │ │ │ │ ├── ListLike.cs │ │ │ │ ├── Program.cs │ │ │ │ └── Sum.cs │ │ │ ├── EqualityComparerDefault/ │ │ │ │ ├── EqualityComparerDefault.csproj │ │ │ │ └── Program.cs │ │ │ ├── FastEnumeration/ │ │ │ │ ├── Adapter.cs │ │ │ │ ├── FastEnumeration.csproj │ │ │ │ ├── FastEnumerator.cs │ │ │ │ ├── ForeachBenchmark.cs │ │ │ │ ├── IFastEnumerator.cs │ │ │ │ ├── NormalEnumerator.cs │ │ │ │ └── Program.cs │ │ │ ├── MultipleRuntimesConfig.cs │ │ │ ├── PerformanceTips.sln │ │ │ └── VirtualCall/ │ │ │ ├── Program.cs │ │ │ ├── VirtualCall.csproj │ │ │ └── VirtualCallBanchmark.cs │ │ ├── PipelineSockets/ │ │ │ ├── PipelineSockets/ │ │ │ │ ├── CancellationTokenExtensions.cs │ │ │ │ ├── Models/ │ │ │ │ │ ├── A.cs │ │ │ │ │ ├── B.cs │ │ │ │ │ ├── C.cs │ │ │ │ │ ├── IntVector.cs │ │ │ │ │ ├── StringPipeExtentions.cs │ │ │ │ │ ├── UnmanagedPipeExtentions.cs │ │ │ │ │ └── Vector.cs │ │ │ │ ├── MyClient.cs │ │ │ │ ├── MyConnection.cs │ │ │ │ ├── MyServer.cs │ │ │ │ ├── PipelineSockets.csproj │ │ │ │ ├── Program.cs │ │ │ │ └── Ref/ │ │ │ │ ├── BufferReader.cs │ │ │ │ └── ThrowHelper.cs │ │ │ └── PipelineSockets.sln │ │ ├── SpanPerformance/ │ │ │ ├── MatrixBenchmark/ │ │ │ │ ├── ByRef.cs │ │ │ │ ├── ByValue.cs │ │ │ │ ├── MatrixBenchmark.cs │ │ │ │ ├── MatrixBenchmark.csproj │ │ │ │ ├── Program.cs │ │ │ │ └── Simd.cs │ │ │ ├── SpanPerformance.sln │ │ │ ├── StringManipulation/ │ │ │ │ ├── Classic/ │ │ │ │ │ └── StringExtensions.cs │ │ │ │ ├── FullyTuned/ │ │ │ │ │ └── StringExtensions.cs │ │ │ │ ├── SafeStackalloc/ │ │ │ │ │ ├── IStringFormatter.cs │ │ │ │ │ ├── IStringSplitter.cs │ │ │ │ │ ├── Splitter.cs │ │ │ │ │ ├── StringExtensions.cs │ │ │ │ │ ├── ToCamel.cs │ │ │ │ │ ├── ToSnake.cs │ │ │ │ │ └── UpperCaseSplitter.cs │ │ │ │ ├── StringManipulation.csproj │ │ │ │ └── Unsafe/ │ │ │ │ ├── IStringFormatter.cs │ │ │ │ ├── IStringSplitter.cs │ │ │ │ ├── Splitter.cs │ │ │ │ ├── StringExtensions.cs │ │ │ │ ├── StringSpan.cs │ │ │ │ ├── ToCamel.cs │ │ │ │ ├── ToSnake.cs │ │ │ │ └── UpperCaseSplitter.cs │ │ │ ├── StringManipulation.Benchmark/ │ │ │ │ ├── Benchmark.cs │ │ │ │ ├── IStringManipulater.cs │ │ │ │ ├── Program.cs │ │ │ │ └── StringManipulation.Benchmark.csproj │ │ │ ├── StringManipulation.Test/ │ │ │ │ ├── IStringManipulater.cs │ │ │ │ ├── StringManipulation.Test.csproj │ │ │ │ └── Test.cs │ │ │ └── SubstringBenchmark/ │ │ │ ├── AbstractString.cs │ │ │ ├── Program.cs │ │ │ ├── SubstringBenchmark.cs │ │ │ └── SubstringBenchmark.csproj │ │ ├── TableMath/ │ │ │ ├── TableMath/ │ │ │ │ ├── SinCosTable.cs │ │ │ │ ├── SinCosTableF.cs │ │ │ │ └── TableMath.csproj │ │ │ ├── TableMath.sln │ │ │ ├── TableMathBenchmark/ │ │ │ │ ├── Program.cs │ │ │ │ ├── SinCosTableUnsafeF.cs │ │ │ │ ├── TableBenchmark.cs │ │ │ │ └── TableMathBenchmark.csproj │ │ │ ├── TableMathTest/ │ │ │ │ ├── SinCosTableFTest.cs │ │ │ │ ├── SinCosTableTest.cs │ │ │ │ └── TableMathTest.csproj │ │ │ └── readme.md │ │ ├── TemplateSelector/ │ │ │ ├── App.xaml │ │ │ ├── App.xaml.cs │ │ │ ├── MainWindow.xaml │ │ │ ├── MainWindow.xaml.cs │ │ │ ├── MySelector.cs │ │ │ ├── TemplateSelector.sln │ │ │ ├── Templates/ │ │ │ │ ├── Integer.xaml │ │ │ │ ├── String.xaml │ │ │ │ └── WpfApp2/ │ │ │ │ └── Sample/ │ │ │ │ ├── Alpha.xaml │ │ │ │ ├── Beta.xaml │ │ │ │ └── Gamma.xaml │ │ │ └── WpfApp2.csproj │ │ └── WpfNewCsproj1/ │ │ ├── WpfNewCsproj1/ │ │ │ ├── App.config │ │ │ ├── App.xaml │ │ │ ├── App.xaml.cs │ │ │ ├── MainWindow.xaml │ │ │ ├── MainWindow.xaml.cs │ │ │ ├── Properties/ │ │ │ │ ├── Resources.Designer.cs │ │ │ │ ├── Resources.resx │ │ │ │ ├── Settings.Designer.cs │ │ │ │ └── Settings.settings │ │ │ └── WpfNewCsproj1.csproj │ │ ├── WpfNewCsproj1.sln │ │ └── readme.md │ ├── 2019/ │ │ ├── BoolExhaustiveness/ │ │ │ ├── BoolExhaustiveness.sln │ │ │ ├── BoolMarshaling/ │ │ │ │ ├── BoolMarshaling.csproj │ │ │ │ ├── Program.cs │ │ │ │ └── rust/ │ │ │ │ ├── Cargo.toml │ │ │ │ ├── src/ │ │ │ │ │ └── lib.rs │ │ │ │ └── target/ │ │ │ │ └── .rustc_info.json │ │ │ ├── BoolOtherThan01/ │ │ │ │ ├── BoolOtherThan01.csproj │ │ │ │ ├── Pointer.cs │ │ │ │ ├── Program.cs │ │ │ │ ├── StructUnion.cs │ │ │ │ ├── TypeSwitch.cs │ │ │ │ └── UnsafeClass.cs │ │ │ └── Csharp8/ │ │ │ ├── Csharp8.csproj │ │ │ └── Program.cs │ │ ├── Csharp80/ │ │ │ ├── Csharp80.sln │ │ │ ├── Preview1/ │ │ │ │ ├── AsyncStreams.cs │ │ │ │ ├── InterpolatedVerbatimStrings.cs │ │ │ │ ├── NRT.cs │ │ │ │ ├── NullCoalescingAssignment.cs │ │ │ │ ├── Preview1.csproj │ │ │ │ ├── Range2D.cs │ │ │ │ ├── RangeAndIndex.cs │ │ │ │ └── ThrowHelper.cs │ │ │ ├── Preview2/ │ │ │ │ ├── AsyncStreams.cs │ │ │ │ ├── AsyncStreamsOptionalParamater.cs │ │ │ │ ├── BoolExhaustiveness.cs │ │ │ │ ├── EnhancedUsing.cs │ │ │ │ ├── PatternBasedAsyncUsing.cs │ │ │ │ ├── PatternBasedUsing.cs │ │ │ │ ├── PatternBasedUsingForeach.cs │ │ │ │ ├── Preview2.csproj │ │ │ │ ├── RecursivePattern.cs │ │ │ │ ├── Shadowing.cs │ │ │ │ └── StaticLocalFunction.cs │ │ │ ├── Preview3/ │ │ │ │ ├── PatternBasedForeach.cs │ │ │ │ ├── PatternTrailingComma.cs │ │ │ │ ├── Preview3.csproj │ │ │ │ └── SwitchTrailingComma.cs │ │ │ ├── VS16_1_p1/ │ │ │ │ ├── Program.cs │ │ │ │ ├── UnmanagedGenericStruct.cs │ │ │ │ └── VS16_1_p1.csproj │ │ │ └── VS16_1_p2/ │ │ │ ├── InterfaceDefault.cs │ │ │ ├── NestedStackalloc.cs │ │ │ ├── ReadOnlyMember.cs │ │ │ ├── ReadOnlyRef.cs │ │ │ └── VS16_1_p2.csproj │ │ ├── DataAccessSample/ │ │ │ ├── DataAccessSample/ │ │ │ │ ├── Connection.cs │ │ │ │ ├── DataAccess/ │ │ │ │ │ ├── DapperRepository.cs │ │ │ │ │ ├── EFCompiledQueryRepository.cs │ │ │ │ │ ├── EFCoreRepository.cs │ │ │ │ │ ├── EFFromSqlRepository.cs │ │ │ │ │ └── IDataSource.cs │ │ │ │ ├── DataAccessBenchmark.cs │ │ │ │ ├── DataAccessSample.csproj │ │ │ │ ├── IQueryableExtensions.cs │ │ │ │ ├── Models/ │ │ │ │ │ ├── Categories.cs │ │ │ │ │ ├── CustomerCustomerDemo.cs │ │ │ │ │ ├── CustomerDemographics.cs │ │ │ │ │ ├── Customers.cs │ │ │ │ │ ├── EmployeeTerritories.cs │ │ │ │ │ ├── Employees.cs │ │ │ │ │ ├── NorthwindContext.cs │ │ │ │ │ ├── OrderDetails.cs │ │ │ │ │ ├── Orders.cs │ │ │ │ │ ├── Products.cs │ │ │ │ │ ├── Region.cs │ │ │ │ │ ├── Shippers.cs │ │ │ │ │ ├── Suppliers.cs │ │ │ │ │ └── Territories.cs │ │ │ │ └── Program.cs │ │ │ ├── DataAccessSample.sln │ │ │ └── readme.md │ │ ├── NetCoreGrpc/ │ │ │ ├── ConsoleApp1/ │ │ │ │ ├── ConsoleApp1.csproj │ │ │ │ └── Program.cs │ │ │ ├── GrpcService1/ │ │ │ │ ├── GrpcService1.csproj │ │ │ │ ├── Program.cs │ │ │ │ ├── Properties/ │ │ │ │ │ └── launchSettings.json │ │ │ │ ├── Protos/ │ │ │ │ │ └── greet.proto │ │ │ │ ├── Services/ │ │ │ │ │ └── SampleService.cs │ │ │ │ ├── Startup.cs │ │ │ │ ├── appsettings.Development.json │ │ │ │ └── appsettings.json │ │ │ └── NetCoreGrpc.sln │ │ ├── PathMap/ │ │ │ ├── PathMap/ │ │ │ │ ├── PathMap.csproj │ │ │ │ └── Program.cs │ │ │ └── PathMap.sln │ │ ├── SearchDocx/ │ │ │ ├── SearchDocx/ │ │ │ │ ├── Program.cs │ │ │ │ ├── Properties/ │ │ │ │ │ └── launchSettings.json │ │ │ │ └── SearchDocx.csproj │ │ │ └── SearchDocx.sln │ │ ├── SwitchStatementToExpression/ │ │ │ ├── SwitchStatementToExpression/ │ │ │ │ ├── Program.cs │ │ │ │ └── SwitchStatementToExpression.csproj │ │ │ └── SwitchStatementToExpression.sln │ │ └── ThreadPost/ │ │ ├── ThreadPost/ │ │ │ ├── BlockingSynchronizationContext.cs │ │ │ ├── IUpdatable.cs │ │ │ ├── IntervalUpdateThread.cs │ │ │ ├── ManualResetValueTaskSource.cs │ │ │ ├── ObjectPool.cs │ │ │ ├── Program.cs │ │ │ ├── SynchronizationContextAsyncExtensions.Action0.cs │ │ │ ├── SynchronizationContextAsyncExtensions.Action1.cs │ │ │ ├── SynchronizationContextAsyncExtensions.Diagnostics.cs │ │ │ ├── SynchronizationContextAsyncExtensions.Func1.cs │ │ │ ├── SynchronizationContextAsyncExtensions.Func2.cs │ │ │ ├── SynchronizationContextPostItem.cs │ │ │ ├── ThreadPost.csproj │ │ │ └── UpdatableSynchronizationContext.cs │ │ └── ThreadPost.sln │ ├── 2020/ │ │ ├── Csharp9_0/ │ │ │ ├── Csharp9_0.sln │ │ │ ├── ModuleInitializer/ │ │ │ │ ├── ModuleInitializer.cs │ │ │ │ ├── ModuleInitializer.csproj │ │ │ │ ├── Reflection.cs │ │ │ │ ├── Sample.cs │ │ │ │ ├── StaticConstructor.cs │ │ │ │ └── TypeRepository.cs │ │ │ ├── NullableReferenceType9/ │ │ │ │ ├── DefaultConstraint.cs │ │ │ │ ├── MemberNotNull.cs │ │ │ │ ├── NullableReferenceType9.csproj │ │ │ │ ├── Program.cs │ │ │ │ └── UnconstrainedGenericParameter.cs │ │ │ └── TopLevelProgram/ │ │ │ ├── Program.cs │ │ │ └── TopLevelProgram.csproj │ │ ├── MetricSpace/ │ │ │ ├── MetricSpace/ │ │ │ │ ├── AddDuplicateBehavior.cs │ │ │ │ ├── DuplicateNodeError.cs │ │ │ │ ├── KdTree.cs │ │ │ │ ├── KdTreeNode.cs │ │ │ │ ├── MetricSpace.csproj │ │ │ │ ├── NearestNeighbourList.cs │ │ │ │ ├── PriorityQueue.cs │ │ │ │ ├── Rect.cs │ │ │ │ └── Traits/ │ │ │ │ ├── Arithmetics/ │ │ │ │ │ ├── DoubleArithmetic.cs │ │ │ │ │ ├── FloatArithmetic.cs │ │ │ │ │ ├── IArithmetic.cs │ │ │ │ │ └── IntArithmetic.cs │ │ │ │ ├── Array/ │ │ │ │ │ ├── FixedArray.cs │ │ │ │ │ ├── IFixedArray.cs │ │ │ │ │ └── IFixedArrayAccessor.cs │ │ │ │ ├── Instantiation.cs │ │ │ │ └── Metrics/ │ │ │ │ ├── ChebyshevMetric.cs │ │ │ │ ├── EuclideanMetric.cs │ │ │ │ ├── IMetric.cs │ │ │ │ └── ManhattanMetric.cs │ │ │ ├── MetricSpace.sln │ │ │ └── XUnitTestMetricSpace/ │ │ │ ├── UnitTest1.cs │ │ │ └── XUnitTestMetricSpace.csproj │ │ └── ReadModReq/ │ │ ├── .gitignore │ │ ├── Csharp7.0/ │ │ │ └── Csharp7.0.csproj │ │ ├── Csharp7.2/ │ │ │ └── Csharp7.2.csproj │ │ ├── Csharp8.0/ │ │ │ └── Csharp8.0.csproj │ │ ├── LibModReq/ │ │ │ ├── Class1.cs │ │ │ └── LibModReq.csproj │ │ ├── ReadModReq/ │ │ │ ├── Program.cs │ │ │ └── ReadModReq.csproj │ │ ├── ReadModReq.sln │ │ ├── UseModReq.cs │ │ └── readme.md │ ├── 2021/ │ │ ├── AnalyzerPackageReference/ │ │ │ ├── AnalyzerPackageReference/ │ │ │ │ ├── AnalyzerPackageReference.csproj │ │ │ │ ├── NonCopyableAttribute.cs │ │ │ │ └── Program.cs │ │ │ └── AnalyzerPackageReference.sln │ │ ├── ColorizeByProject/ │ │ │ ├── A/ │ │ │ │ └── A.csproj │ │ │ ├── B/ │ │ │ │ └── B.csproj │ │ │ ├── C/ │ │ │ │ └── C.csproj │ │ │ ├── ClassLibrary1/ │ │ │ │ ├── A.cs │ │ │ │ ├── B.cs │ │ │ │ ├── C.cs │ │ │ │ ├── ClassLibrary1.csproj │ │ │ │ ├── D.cs │ │ │ │ ├── E.cs │ │ │ │ ├── F.cs │ │ │ │ ├── G.cs │ │ │ │ ├── H.cs │ │ │ │ ├── I.cs │ │ │ │ ├── J.cs │ │ │ │ ├── K.cs │ │ │ │ ├── L.cs │ │ │ │ ├── M.cs │ │ │ │ ├── N.cs │ │ │ │ ├── O.cs │ │ │ │ ├── P.cs │ │ │ │ ├── Q.cs │ │ │ │ ├── R.cs │ │ │ │ ├── S.cs │ │ │ │ ├── T.cs │ │ │ │ ├── U.cs │ │ │ │ ├── V.cs │ │ │ │ ├── W.cs │ │ │ │ ├── X.cs │ │ │ │ ├── Y.cs │ │ │ │ └── Z.cs │ │ │ ├── ColorizeByProject.sln │ │ │ ├── D/ │ │ │ │ └── D.csproj │ │ │ ├── E/ │ │ │ │ └── E.csproj │ │ │ ├── F/ │ │ │ │ └── F.csproj │ │ │ ├── G/ │ │ │ │ └── G.csproj │ │ │ ├── H/ │ │ │ │ └── H.csproj │ │ │ ├── I/ │ │ │ │ └── I.csproj │ │ │ ├── J/ │ │ │ │ └── J.csproj │ │ │ ├── K/ │ │ │ │ └── K.csproj │ │ │ ├── L/ │ │ │ │ └── L.csproj │ │ │ ├── M/ │ │ │ │ └── M.csproj │ │ │ ├── N/ │ │ │ │ └── N.csproj │ │ │ ├── O/ │ │ │ │ └── O.csproj │ │ │ ├── P/ │ │ │ │ └── P.csproj │ │ │ ├── Q/ │ │ │ │ └── Q.csproj │ │ │ ├── R/ │ │ │ │ └── R.csproj │ │ │ ├── S/ │ │ │ │ └── S.csproj │ │ │ ├── T/ │ │ │ │ └── T.csproj │ │ │ ├── U/ │ │ │ │ └── U.csproj │ │ │ ├── V/ │ │ │ │ └── V.csproj │ │ │ ├── W/ │ │ │ │ └── W.csproj │ │ │ ├── X/ │ │ │ │ └── X.csproj │ │ │ ├── Y/ │ │ │ │ └── Y.csproj │ │ │ └── Z/ │ │ │ └── Z.csproj │ │ ├── Csharp10/ │ │ │ ├── CallerArgument/ │ │ │ │ ├── AllCallerInfo/ │ │ │ │ │ ├── AllCallerInfo.csproj │ │ │ │ │ └── Program.cs │ │ │ │ ├── CallerArgument/ │ │ │ │ │ ├── CallerArgument.csproj │ │ │ │ │ └── Program.cs │ │ │ │ └── ThrowIfNull/ │ │ │ │ ├── Program.cs │ │ │ │ └── ThrowIfNull.csproj │ │ │ ├── Csharp10.sln │ │ │ ├── InterpolatedStrings/ │ │ │ │ ├── AppendFormattedOverload/ │ │ │ │ │ ├── .editorconfig │ │ │ │ │ ├── AppendFormattedOverload.csproj │ │ │ │ │ └── Program.cs │ │ │ │ ├── Benchmark/ │ │ │ │ │ ├── .editorconfig │ │ │ │ │ ├── Benchmark.csproj │ │ │ │ │ └── Program.cs │ │ │ │ ├── BoolReturn/ │ │ │ │ │ ├── .editorconfig │ │ │ │ │ ├── BoolReturn.csproj │ │ │ │ │ └── Program.cs │ │ │ │ ├── ConstString/ │ │ │ │ │ ├── ConstString.csproj │ │ │ │ │ └── Program.cs │ │ │ │ ├── DefaultInterpolatedStringHandler/ │ │ │ │ │ ├── .editorconfig │ │ │ │ │ ├── DefaultInterpolatedStringHandler.csproj │ │ │ │ │ └── Program.cs │ │ │ │ ├── FormattingHandler/ │ │ │ │ │ ├── .editorconfig │ │ │ │ │ ├── FormattingHandler.csproj │ │ │ │ │ └── Program.cs │ │ │ │ ├── ImprovedInterpolatedStrings/ │ │ │ │ │ ├── .editorconfig │ │ │ │ │ ├── ImprovedInterpolatedStrings.csproj │ │ │ │ │ └── Program.cs │ │ │ │ ├── InterpolatedStringHandlerArgument/ │ │ │ │ │ ├── .editorconfig │ │ │ │ │ ├── InterpolatedStringHandlerArgument.csproj │ │ │ │ │ └── Program.cs │ │ │ │ ├── InvariantGlobalization/ │ │ │ │ │ ├── Invariant.cs │ │ │ │ │ ├── InvariantGlobalization.csproj │ │ │ │ │ ├── Iso8601.cs │ │ │ │ │ └── Program.cs │ │ │ │ ├── MinimalHandler/ │ │ │ │ │ ├── .editorconfig │ │ │ │ │ ├── MinimalHandler.csproj │ │ │ │ │ └── Program.cs │ │ │ │ ├── OverloadResolution/ │ │ │ │ │ ├── .editorconfig │ │ │ │ │ ├── C1.cs │ │ │ │ │ ├── C2.cs │ │ │ │ │ ├── OverloadResolution.csproj │ │ │ │ │ └── Program.cs │ │ │ │ └── ParamsDictionary/ │ │ │ │ ├── ParamsDictionary.csproj │ │ │ │ └── Program.cs │ │ │ ├── Lambda/ │ │ │ │ ├── AttributeAndReturn/ │ │ │ │ │ ├── .editorconfig │ │ │ │ │ ├── AttributeAndReturn.csproj │ │ │ │ │ └── Program.cs │ │ │ │ ├── AttributeWeb/ │ │ │ │ │ ├── AttributeWeb.csproj │ │ │ │ │ ├── Program.cs │ │ │ │ │ ├── Properties/ │ │ │ │ │ │ └── launchSettings.json │ │ │ │ │ ├── appsettings.Development.json │ │ │ │ │ └── appsettings.json │ │ │ │ ├── NaturalType/ │ │ │ │ │ ├── .editorconfig │ │ │ │ │ ├── NaturalType.csproj │ │ │ │ │ └── Program.cs │ │ │ │ ├── SimpleReturn/ │ │ │ │ │ ├── Program.cs │ │ │ │ │ └── SimpleReturn.csproj │ │ │ │ ├── SimpleWeb/ │ │ │ │ │ ├── Program.cs │ │ │ │ │ ├── Properties/ │ │ │ │ │ │ └── launchSettings.json │ │ │ │ │ ├── SimpleWeb.csproj │ │ │ │ │ ├── appsettings.Development.json │ │ │ │ │ └── appsettings.json │ │ │ │ └── TargetTypedReturn/ │ │ │ │ ├── Program.cs │ │ │ │ └── TargetTypedReturn.csproj │ │ │ ├── Others/ │ │ │ │ ├── ExtendedPropertyPetterns/ │ │ │ │ │ ├── ExtendedPropertyPetterns.csproj │ │ │ │ │ └── Program.cs │ │ │ │ └── MixedDeconstruction/ │ │ │ │ ├── MixedDeconstruction.csproj │ │ │ │ └── Program.cs │ │ │ ├── ParameterlessConstructors/ │ │ │ │ ├── ActivatorBug/ │ │ │ │ │ ├── ActivatorBug.csproj │ │ │ │ │ └── Program.cs │ │ │ │ ├── CreateInstanceBenchmark/ │ │ │ │ │ ├── .editorconfig │ │ │ │ │ ├── CreateInstanceBenchmark.csproj │ │ │ │ │ └── Program.cs │ │ │ │ ├── DefaultParameter/ │ │ │ │ │ ├── DefaultParameter.csproj │ │ │ │ │ └── Program.cs │ │ │ │ ├── FieldInitializer/ │ │ │ │ │ ├── FieldInitializer.csproj │ │ │ │ │ └── Program.cs │ │ │ │ ├── GenericNew/ │ │ │ │ │ ├── .editorconfig │ │ │ │ │ ├── GenericNew.csproj │ │ │ │ │ └── Program.cs │ │ │ │ ├── ImmutableArray/ │ │ │ │ │ ├── ImmutableArray.csproj │ │ │ │ │ └── Program.cs │ │ │ │ ├── NewOrDefault/ │ │ │ │ │ ├── NewOrDefault.csproj │ │ │ │ │ └── Program.cs │ │ │ │ ├── NonPublicConstructor/ │ │ │ │ │ ├── NonPublicConstructor.csproj │ │ │ │ │ └── Program.cs │ │ │ │ ├── RecordStruct/ │ │ │ │ │ ├── Program.cs │ │ │ │ │ └── RecordStruct.csproj │ │ │ │ └── Zeroed/ │ │ │ │ ├── .editorconfig │ │ │ │ ├── Program.cs │ │ │ │ └── Zeroed.csproj │ │ │ ├── RecordStruct/ │ │ │ │ ├── HidingField/ │ │ │ │ │ ├── HidingField.csproj │ │ │ │ │ └── Program.cs │ │ │ │ ├── Metadata/ │ │ │ │ │ ├── Metadata.csproj │ │ │ │ │ └── Program.cs │ │ │ │ ├── RecordStruct/ │ │ │ │ │ ├── Program.cs │ │ │ │ │ └── RecordStruct.csproj │ │ │ │ ├── VsClass/ │ │ │ │ │ ├── Program.cs │ │ │ │ │ └── VsClass.csproj │ │ │ │ ├── VsNormalStruct/ │ │ │ │ │ ├── Program.cs │ │ │ │ │ └── VsNormalStruct.csproj │ │ │ │ └── With/ │ │ │ │ ├── Program.cs │ │ │ │ └── With.csproj │ │ │ ├── StaticAbstract/ │ │ │ │ └── GenericMath/ │ │ │ │ ├── Algebra/ │ │ │ │ │ ├── GaloisField.cs │ │ │ │ │ ├── IConstant.cs │ │ │ │ │ ├── IField.cs │ │ │ │ │ └── Natural.cs │ │ │ │ ├── GenericMath.csproj │ │ │ │ └── Program.cs │ │ │ └── readme.md │ │ ├── Csharp9/ │ │ │ ├── Csharp9.sln │ │ │ ├── Record/ │ │ │ │ └── InParams/ │ │ │ │ ├── InParams.csproj │ │ │ │ └── Program.cs │ │ │ └── readme.md │ │ ├── EmojiData/ │ │ │ └── readme.md │ │ ├── GenericMath/ │ │ │ ├── GenericMath/ │ │ │ │ ├── FixedArray.cs │ │ │ │ ├── GenericMath.csproj │ │ │ │ ├── MathInterfaces.cs │ │ │ │ └── Program.cs │ │ │ └── GenericMath.sln │ │ ├── ImplicitUsings/ │ │ │ ├── ConsoleApp1/ │ │ │ │ ├── ConsoleApp1.csproj │ │ │ │ └── Program.cs │ │ │ ├── ConsoleAppDesktop/ │ │ │ │ ├── ConsoleAppDesktop.csproj │ │ │ │ └── Program.cs │ │ │ ├── ConsoleAppUseWinForms/ │ │ │ │ ├── ConsoleAppUseWinForms.csproj │ │ │ │ └── Program.cs │ │ │ ├── ConsoleAppUseWpf/ │ │ │ │ ├── ConsoleAppUseWpf.csproj │ │ │ │ └── Program.cs │ │ │ ├── Directory.Build.props │ │ │ ├── ImplicitUsings.sln │ │ │ └── WebApplication1/ │ │ │ ├── Pages/ │ │ │ │ ├── Error.cshtml │ │ │ │ ├── Error.cshtml.cs │ │ │ │ ├── Index.cshtml │ │ │ │ ├── Index.cshtml.cs │ │ │ │ ├── Privacy.cshtml │ │ │ │ ├── Privacy.cshtml.cs │ │ │ │ ├── Shared/ │ │ │ │ │ ├── _Layout.cshtml │ │ │ │ │ ├── _Layout.cshtml.css │ │ │ │ │ └── _ValidationScriptsPartial.cshtml │ │ │ │ ├── _ViewImports.cshtml │ │ │ │ └── _ViewStart.cshtml │ │ │ ├── Program.cs │ │ │ ├── Properties/ │ │ │ │ └── launchSettings.json │ │ │ ├── WebApplication1.csproj │ │ │ ├── appsettings.Development.json │ │ │ ├── appsettings.json │ │ │ └── wwwroot/ │ │ │ ├── css/ │ │ │ │ └── site.css │ │ │ ├── js/ │ │ │ │ └── site.js │ │ │ └── lib/ │ │ │ ├── bootstrap/ │ │ │ │ ├── LICENSE │ │ │ │ └── dist/ │ │ │ │ ├── css/ │ │ │ │ │ ├── bootstrap-grid.css │ │ │ │ │ ├── bootstrap-grid.rtl.css │ │ │ │ │ ├── bootstrap-reboot.css │ │ │ │ │ ├── bootstrap-reboot.rtl.css │ │ │ │ │ ├── bootstrap-utilities.css │ │ │ │ │ ├── bootstrap-utilities.rtl.css │ │ │ │ │ ├── bootstrap.css │ │ │ │ │ └── bootstrap.rtl.css │ │ │ │ └── js/ │ │ │ │ ├── bootstrap.bundle.js │ │ │ │ ├── bootstrap.esm.js │ │ │ │ └── bootstrap.js │ │ │ ├── jquery/ │ │ │ │ ├── LICENSE.txt │ │ │ │ └── dist/ │ │ │ │ └── jquery.js │ │ │ ├── jquery-validation/ │ │ │ │ ├── LICENSE.md │ │ │ │ └── dist/ │ │ │ │ ├── additional-methods.js │ │ │ │ └── jquery.validate.js │ │ │ └── jquery-validation-unobtrusive/ │ │ │ ├── LICENSE.txt │ │ │ └── jquery.validate.unobtrusive.js │ │ ├── ModuleInitializerNet48/ │ │ │ ├── ConsoleApp1/ │ │ │ │ ├── ConsoleApp1.csproj │ │ │ │ └── Program.cs │ │ │ └── ModuleInitializerNet48.sln │ │ ├── NewTemplatesInNet6/ │ │ │ ├── ConsoleApp1/ │ │ │ │ ├── ConsoleApp1.csproj │ │ │ │ └── Program.cs │ │ │ ├── NewTemplatesInNet6.sln │ │ │ ├── WebApplication1/ │ │ │ │ ├── Pages/ │ │ │ │ │ ├── Error.cshtml │ │ │ │ │ ├── Error.cshtml.cs │ │ │ │ │ ├── Index.cshtml │ │ │ │ │ ├── Index.cshtml.cs │ │ │ │ │ ├── Privacy.cshtml │ │ │ │ │ ├── Privacy.cshtml.cs │ │ │ │ │ ├── Shared/ │ │ │ │ │ │ ├── _Layout.cshtml │ │ │ │ │ │ └── _ValidationScriptsPartial.cshtml │ │ │ │ │ ├── _ViewImports.cshtml │ │ │ │ │ └── _ViewStart.cshtml │ │ │ │ ├── Program.cs │ │ │ │ ├── Properties/ │ │ │ │ │ └── launchSettings.json │ │ │ │ ├── WebApplication1.csproj │ │ │ │ ├── appsettings.Development.json │ │ │ │ ├── appsettings.json │ │ │ │ └── wwwroot/ │ │ │ │ ├── css/ │ │ │ │ │ └── site.css │ │ │ │ ├── js/ │ │ │ │ │ └── site.js │ │ │ │ └── lib/ │ │ │ │ ├── bootstrap/ │ │ │ │ │ ├── LICENSE │ │ │ │ │ └── dist/ │ │ │ │ │ ├── css/ │ │ │ │ │ │ ├── bootstrap-grid.css │ │ │ │ │ │ ├── bootstrap-reboot.css │ │ │ │ │ │ └── bootstrap.css │ │ │ │ │ └── js/ │ │ │ │ │ ├── bootstrap.bundle.js │ │ │ │ │ └── bootstrap.js │ │ │ │ ├── jquery/ │ │ │ │ │ ├── LICENSE.txt │ │ │ │ │ └── dist/ │ │ │ │ │ └── jquery.js │ │ │ │ ├── jquery-validation/ │ │ │ │ │ ├── LICENSE.md │ │ │ │ │ └── dist/ │ │ │ │ │ ├── additional-methods.js │ │ │ │ │ └── jquery.validate.js │ │ │ │ └── jquery-validation-unobtrusive/ │ │ │ │ ├── LICENSE.txt │ │ │ │ └── jquery.validate.unobtrusive.js │ │ │ └── WebApplication2/ │ │ │ ├── Controllers/ │ │ │ │ └── HomeController.cs │ │ │ ├── Models/ │ │ │ │ └── ErrorViewModel.cs │ │ │ ├── Program.cs │ │ │ ├── Properties/ │ │ │ │ └── launchSettings.json │ │ │ ├── Views/ │ │ │ │ ├── Home/ │ │ │ │ │ ├── Index.cshtml │ │ │ │ │ └── Privacy.cshtml │ │ │ │ ├── Shared/ │ │ │ │ │ ├── Error.cshtml │ │ │ │ │ ├── _Layout.cshtml │ │ │ │ │ └── _ValidationScriptsPartial.cshtml │ │ │ │ ├── _ViewImports.cshtml │ │ │ │ └── _ViewStart.cshtml │ │ │ ├── WebApplication2.csproj │ │ │ ├── appsettings.Development.json │ │ │ ├── appsettings.json │ │ │ └── wwwroot/ │ │ │ ├── css/ │ │ │ │ └── site.css │ │ │ ├── js/ │ │ │ │ └── site.js │ │ │ └── lib/ │ │ │ ├── bootstrap/ │ │ │ │ ├── LICENSE │ │ │ │ └── dist/ │ │ │ │ ├── css/ │ │ │ │ │ ├── bootstrap-grid.css │ │ │ │ │ ├── bootstrap-reboot.css │ │ │ │ │ └── bootstrap.css │ │ │ │ └── js/ │ │ │ │ ├── bootstrap.bundle.js │ │ │ │ └── bootstrap.js │ │ │ ├── jquery/ │ │ │ │ ├── LICENSE.txt │ │ │ │ └── dist/ │ │ │ │ └── jquery.js │ │ │ ├── jquery-validation/ │ │ │ │ ├── LICENSE.md │ │ │ │ └── dist/ │ │ │ │ ├── additional-methods.js │ │ │ │ └── jquery.validate.js │ │ │ └── jquery-validation-unobtrusive/ │ │ │ ├── LICENSE.txt │ │ │ └── jquery.validate.unobtrusive.js │ │ └── NoThrowAwaiter/ │ │ ├── NoThrowAwaiter/ │ │ │ ├── IgnoreCancelBenchmark.cs │ │ │ ├── NoThrowAwaiter.csproj │ │ │ ├── NoThrowOnCancelAwaiter.cs │ │ │ ├── Program.cs │ │ │ ├── ResultOrCancel.cs │ │ │ └── TaskExtensions.cs │ │ └── NoThrowAwaiter.sln │ ├── 2022/ │ │ ├── Algebra/ │ │ │ ├── Algebra/ │ │ │ │ ├── Algebra.csproj │ │ │ │ ├── Constants/ │ │ │ │ │ ├── IConstant.cs │ │ │ │ │ ├── IntConstants.cs │ │ │ │ │ ├── IntegerConstant.cs │ │ │ │ │ └── RationalConstant.cs │ │ │ │ ├── Conversion.cs │ │ │ │ ├── EuclideanAlgorithm.cs │ │ │ │ ├── QuadraticField.cs │ │ │ │ ├── Rational.cs │ │ │ │ └── RationalQuadraticField.cs │ │ │ ├── Algebra.sln │ │ │ ├── ConsoleApp1/ │ │ │ │ ├── ConsoleApp1.csproj │ │ │ │ └── Program.cs │ │ │ └── TestAlgebra/ │ │ │ ├── EuclideanAlgorithmTest.cs │ │ │ ├── TestAlgebra.csproj │ │ │ └── Usings.cs │ │ ├── Csharp11/ │ │ │ ├── 17.0/ │ │ │ │ └── GenericAttribute/ │ │ │ │ ├── GenericAttribute.csproj │ │ │ │ └── Program.cs │ │ │ ├── 17.1p1/ │ │ │ │ └── NewlineInInterpolation/ │ │ │ │ ├── NewlineInInterpolation.csproj │ │ │ │ └── Program.cs │ │ │ ├── 17.1p2/ │ │ │ │ └── ListPattern/ │ │ │ │ ├── ListPattern.csproj │ │ │ │ └── Program.cs │ │ │ ├── 17.1p3/ │ │ │ │ └── NullCheck/ │ │ │ │ ├── NullCheck.csproj │ │ │ │ └── Program.cs │ │ │ ├── 17.2p1/ │ │ │ │ ├── CacheDelegate/ │ │ │ │ │ ├── CacheDelegate.csproj │ │ │ │ │ └── Program.cs │ │ │ │ └── RawStringLiteral/ │ │ │ │ ├── Program.cs │ │ │ │ ├── RawStringLiteral.csproj │ │ │ │ └── Whitespaces.cs │ │ │ ├── 17.3p1/ │ │ │ │ ├── AutoDefaultStruct/ │ │ │ │ │ ├── AutoDefaultStruct.csproj │ │ │ │ │ └── Program.cs │ │ │ │ ├── CheckedOperator/ │ │ │ │ │ ├── CheckedOperator.csproj │ │ │ │ │ └── Program.cs │ │ │ │ ├── PatternROS/ │ │ │ │ │ ├── PatternROS.csproj │ │ │ │ │ └── Program.cs │ │ │ │ ├── UnsignedRightShift/ │ │ │ │ │ ├── Program.cs │ │ │ │ │ └── UnsignedRightShift.csproj │ │ │ │ └── Utf8Literal/ │ │ │ │ ├── Program.cs │ │ │ │ └── Utf8Literal.csproj │ │ │ ├── 17.3p2/ │ │ │ │ ├── NameOfParameter/ │ │ │ │ │ ├── NameOfParameter.csproj │ │ │ │ │ └── Program.cs │ │ │ │ ├── NumericIntPtr/ │ │ │ │ │ ├── NumericIntPtr.csproj │ │ │ │ │ └── Program.cs │ │ │ │ ├── RelaxingShiftOperator/ │ │ │ │ │ ├── Background.cs │ │ │ │ │ ├── Drawback.cs │ │ │ │ │ ├── Program.cs │ │ │ │ │ └── RelaxingShiftOperator.csproj │ │ │ │ ├── RequiredMembers/ │ │ │ │ │ ├── MembersNotNull.cs │ │ │ │ │ ├── Program.cs │ │ │ │ │ └── RequiredMembers.csproj │ │ │ │ └── StaticVirtual/ │ │ │ │ ├── GenericMath.cs │ │ │ │ ├── Parsable.cs │ │ │ │ ├── Program.cs │ │ │ │ ├── StaticAbstract.cs │ │ │ │ ├── StaticBehavior.cs │ │ │ │ └── StaticVirtual.csproj │ │ │ ├── 17.4p1/ │ │ │ │ ├── FileLocal/ │ │ │ │ │ ├── A.cs │ │ │ │ │ ├── FileLocal.csproj │ │ │ │ │ ├── Inheritance.cs │ │ │ │ │ ├── Interface.cs │ │ │ │ │ ├── Program.cs │ │ │ │ │ └── R.cs │ │ │ │ └── RefField/ │ │ │ │ ├── FixedArray.cs │ │ │ │ ├── MultipleRefReturn.cs │ │ │ │ ├── Program.cs │ │ │ │ ├── RefField.csproj │ │ │ │ └── TypedRef.cs │ │ │ ├── Csharp11.sln │ │ │ └── Directory.build.targets │ │ ├── EmbeddedLanguages/ │ │ │ ├── .editorconfig │ │ │ ├── Directory.Build.targets │ │ │ ├── EmbeddedLanguages.sln │ │ │ ├── Example/ │ │ │ │ ├── Example.csproj │ │ │ │ └── Program.cs │ │ │ ├── WithFeatures/ │ │ │ │ └── WithFeatures.csproj │ │ │ ├── WithoutFeatures/ │ │ │ │ ├── Program.cs │ │ │ │ └── WithoutFeatures.csproj │ │ │ └── readme.md │ │ ├── NBitInt/ │ │ │ ├── ConsoleApp1/ │ │ │ │ ├── ConsoleApp1.csproj │ │ │ │ └── Program.cs │ │ │ ├── NBitInt/ │ │ │ │ ├── IConstant.cs │ │ │ │ ├── Int.cs │ │ │ │ ├── IntConstant.cs │ │ │ │ └── NBitInt.csproj │ │ │ └── NBitInt.sln │ │ ├── NoMoreT4/ │ │ │ ├── Benchmark/ │ │ │ │ ├── Benchmark.csproj │ │ │ │ ├── GeneratorBenchmark.cs │ │ │ │ ├── Program.cs │ │ │ │ └── Sample.cs │ │ │ ├── ClassLibrary1/ │ │ │ │ ├── ClassLibrary1.csproj │ │ │ │ ├── IGenerator.cs │ │ │ │ ├── InterpolationGenerator.cs │ │ │ │ ├── T4Generator.cs │ │ │ │ ├── T4Generator.partial.cs │ │ │ │ └── T4Generator.tt │ │ │ ├── ConsoleApp1/ │ │ │ │ ├── ConsoleApp1.csproj │ │ │ │ ├── Program.cs │ │ │ │ └── Sample.cs │ │ │ ├── FileGenerator/ │ │ │ │ ├── FileGenerator.csproj │ │ │ │ ├── X.scriban │ │ │ │ └── Y.cs │ │ │ ├── NoMoreT4.sln │ │ │ └── readme.md │ │ ├── StringJoin/ │ │ │ ├── JoinBenchmark.cs │ │ │ ├── Joiner.cs │ │ │ ├── Program.cs │ │ │ ├── StringJoin.csproj │ │ │ ├── StringJoin.sln │ │ │ └── readme.md │ │ └── Whitespace/ │ │ ├── Program.cs │ │ └── Whitespace.csproj │ ├── 2023/ │ │ └── MemberOrder/ │ │ ├── .vscode/ │ │ │ └── settings.json │ │ ├── A.cs │ │ ├── Ab/ │ │ │ └── Ab.csproj │ │ ├── B.cs │ │ ├── Ba/ │ │ │ └── Ba.csproj │ │ ├── Directory.Build.props │ │ ├── Explicit/ │ │ │ └── Explicit.csproj │ │ ├── Implicit/ │ │ │ └── Implicit.csproj │ │ ├── MemberOrder.sln │ │ ├── Program.cs │ │ ├── Z.cs │ │ ├── readme.md │ │ ├── À.cs │ │ ├── α.cs │ │ ├── д.cs │ │ ├── ア.cs │ │ ├── 漢字.cs │ │ ├── ア.cs │ │ ├── 🐈.cs │ │ └── 𩸽.cs │ ├── 2024/ │ │ ├── Distinct/ │ │ │ ├── .editorconfig │ │ │ ├── Directory.Build.props │ │ │ ├── Distinct/ │ │ │ │ ├── Binary.cs │ │ │ │ ├── Distinct.csproj │ │ │ │ ├── Hash.cs │ │ │ │ ├── Linear.cs │ │ │ │ └── SpanHashSet.cs │ │ │ ├── Distinct.slnx │ │ │ ├── DistinctBenchmark/ │ │ │ │ ├── DistinctBenchmark.csproj │ │ │ │ └── Program.cs │ │ │ ├── DistinctTest/ │ │ │ │ ├── BinaryTest.cs │ │ │ │ ├── DistinctTest.csproj │ │ │ │ ├── GlobalUsings.cs │ │ │ │ ├── HashTest.cs │ │ │ │ ├── LinearTest.cs │ │ │ │ └── TestData.cs │ │ │ └── readme.md │ │ └── ValueList/ │ │ ├── Collections/ │ │ │ ├── IListImpl.cs │ │ │ ├── PooledValueList.cs │ │ │ ├── ReferenceImplementation.cs │ │ │ ├── ValueList.cs │ │ │ └── ValueListBuilder.cs │ │ ├── Program.cs │ │ ├── ValueList.csproj │ │ ├── ValueList.sln │ │ └── ValueListBenchmark.cs │ ├── 2025/ │ │ ├── InPlaceGroupBy/ │ │ │ ├── .editorconfig │ │ │ ├── BenchmarkInPlaceGroupBy/ │ │ │ │ ├── BenchmarkInPlaceGroupBy.csproj │ │ │ │ └── Program.cs │ │ │ ├── Directory.Build.props │ │ │ ├── InPlaceGroupBy/ │ │ │ │ ├── InPlaceGroupBy.csproj │ │ │ │ ├── InPlaceSpanExtensions.cs │ │ │ │ └── SortedSpanGrouping.cs │ │ │ ├── InPlaceGroupBy.slnx │ │ │ ├── TestInPlaceGroupBy/ │ │ │ │ ├── Common.cs │ │ │ │ ├── InPlaceGroupBy.cs │ │ │ │ └── TestInPlaceGroupBy.csproj │ │ │ └── readme.md │ │ ├── PseudoDictionary/ │ │ │ ├── .editorconfig │ │ │ ├── BenchmarkPseudoDictionary/ │ │ │ │ ├── BenchmarkPseudoDictionary.csproj │ │ │ │ └── Program.cs │ │ │ ├── Directory.Build.props │ │ │ ├── PseudoDictionary/ │ │ │ │ ├── IListImpl.cs │ │ │ │ ├── PseudoDictionary.csproj │ │ │ │ ├── PseudoDictionaryExtensions.ValueList.cs │ │ │ │ ├── PseudoDictionaryExtensions.cs │ │ │ │ └── ValueListBuilder.cs │ │ │ ├── PseudoDictionary.slnx │ │ │ ├── TestPseudoDictionary/ │ │ │ │ ├── Common.cs │ │ │ │ ├── PseudoDictionaryExtensionsTest.cs │ │ │ │ ├── PseudoDictionaryExtensionsValueListTest.cs │ │ │ │ └── TestPseudoDictionary.csproj │ │ │ └── readme.md │ │ ├── RefReflection/ │ │ │ ├── ConsoleApp1/ │ │ │ │ ├── ConsoleApp1.csproj │ │ │ │ ├── Example/ │ │ │ │ │ ├── A.cs │ │ │ │ │ └── Program1.cs │ │ │ │ ├── Formatter/ │ │ │ │ │ ├── ArrayFormatter.cs │ │ │ │ │ ├── FormatterProvider.cs │ │ │ │ │ ├── IFormatter.cs │ │ │ │ │ ├── Primitives.cs │ │ │ │ │ └── RecordFormatter.cs │ │ │ │ ├── ITupleAccessor.cs │ │ │ │ ├── Program.cs │ │ │ │ ├── TupleAccessor2.cs │ │ │ │ ├── TupleAccessor3.cs │ │ │ │ ├── TupleEnumerator.cs │ │ │ │ ├── TypedRef.cs │ │ │ │ └── UnsafeRef.cs │ │ │ └── RefReflection.slnx │ │ └── StringInDataSection/ │ │ ├── DataSectionAscii/ │ │ │ ├── Class1.cs │ │ │ └── DataSectionAscii.csproj │ │ ├── DataSectionJapanese/ │ │ │ ├── Class1.cs │ │ │ └── DataSectionJapanese.csproj │ │ ├── Directory.build.props │ │ ├── NormalAscii/ │ │ │ ├── Class1.cs │ │ │ └── NormalAscii.csproj │ │ ├── NormalJapanese/ │ │ │ ├── Class1.cs │ │ │ └── NormalJapanese.csproj │ │ ├── StringInDataSection.slnx │ │ └── readme.md │ ├── 2026/ │ │ └── DependencyPropertyGenerator/ │ │ ├── ClassLibrary1/ │ │ │ ├── Class1.cs │ │ │ └── ClassLibrary1.csproj │ │ ├── ClassLibrary1.slnx │ │ ├── Generator/ │ │ │ ├── DependencyPropertyGenerator.cs │ │ │ ├── Generator.csproj │ │ │ └── PolyFill.cs │ │ └── Generator.UnitTests/ │ │ ├── DependencyPropertyGenerator.cs │ │ └── Generator.UnitTests.csproj │ ├── Csharp6/ │ │ ├── Csharp6/ │ │ │ ├── App.config │ │ │ ├── Csharp5/ │ │ │ │ ├── IndexInitializerSample.cs │ │ │ │ ├── NameOfSample.cs │ │ │ │ ├── NullConditional.cs │ │ │ │ ├── Point.cs │ │ │ │ ├── PointJson.cs │ │ │ │ ├── Polygon.cs │ │ │ │ ├── Program.cs │ │ │ │ ├── StaticUsingSample.cs │ │ │ │ └── StringInterpolationSample.cs │ │ │ ├── Csharp6/ │ │ │ │ ├── AwaitInCatchFinally.cs │ │ │ │ ├── ExceptionFilter.cs │ │ │ │ ├── ExtensionCollectionInitializer.cs │ │ │ │ ├── IndexInitializerSample.cs │ │ │ │ ├── NameOfSample.cs │ │ │ │ ├── NullConditional.cs │ │ │ │ ├── Point.cs │ │ │ │ ├── PointJson.cs │ │ │ │ ├── Polygon.cs │ │ │ │ ├── Program.cs │ │ │ │ ├── StaticUsingSample.cs │ │ │ │ └── StringInterpolationSample.cs │ │ │ ├── Csharp6.csproj │ │ │ ├── Misc/ │ │ │ │ ├── AwaitOptimization.cs │ │ │ │ ├── SmallChanges.cs │ │ │ │ ├── StringInterpolationSample.cs │ │ │ │ ├── UsingStaticEnum.cs │ │ │ │ ├── UsingStaticExtensions.cs │ │ │ │ └── UsingStaticNormalClass.cs │ │ │ ├── Program.cs │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ └── packages.config │ │ ├── Csharp6.sln │ │ └── 旧/ │ │ └── Csharp6_CTP3/ │ │ ├── AutoProperty/ │ │ │ ├── App.config │ │ │ ├── AutoProperty.csproj │ │ │ ├── Point.GetterOnly.cs │ │ │ ├── Point.Intializer.cs │ │ │ ├── Point.cs │ │ │ ├── Program.cs │ │ │ └── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── Build2014Demo/ │ │ │ ├── App.config │ │ │ ├── Build2014Demo.csproj │ │ │ ├── Csharp5/ │ │ │ │ ├── Point.cs │ │ │ │ ├── PointJson.cs │ │ │ │ └── Program.cs │ │ │ ├── Csharp6/ │ │ │ │ ├── Point.cs │ │ │ │ ├── PointJson.cs │ │ │ │ └── Program.cs │ │ │ ├── Program.cs │ │ │ └── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── Csharp6.sln │ │ ├── PrimaryConstructor/ │ │ │ ├── App.config │ │ │ ├── FirstQuadrant.cs │ │ │ ├── Point.GetterOnly.cs │ │ │ ├── PrimaryConstructor.csproj │ │ │ ├── Program.cs │ │ │ └── Properties/ │ │ │ └── AssemblyInfo.cs │ │ └── readme.txt │ └── Csharp7/ │ └── 201603/ │ ├── 201603.sln │ └── ConsoleApplication1/ │ ├── App.config │ ├── ConsoleApplication1.csproj │ ├── LocalFunctions/ │ │ └── Closure.cs │ ├── Program.cs │ ├── Properties/ │ │ └── AssemblyInfo.cs │ └── RefReturns/ │ ├── BasedArray.cs │ ├── Point.cs │ └── RefParamsAndReturns.cs ├── Directory.Build.props ├── LICENSE ├── LanguageAndFrameworkVersion/ │ ├── Compatibility 2/ │ │ ├── CallerInfoAttributes.cs │ │ ├── Compatibility 2.csproj │ │ ├── Enumerable.cs │ │ ├── ExtensionAttribute.cs │ │ ├── FormattableString.cs │ │ ├── Func.cs │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ └── readme.txt │ ├── Compatibility 3/ │ │ ├── Compatibility 3.csproj │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ └── readme.txt │ ├── Compatibility 4/ │ │ ├── Compatibility 4.csproj │ │ └── Properties/ │ │ └── AssemblyInfo.cs │ ├── LanguageAndFrameworkVersion.sln │ ├── SharedProject/ │ │ ├── Csharp3/ │ │ │ ├── AnonymousTypeSample.cs │ │ │ ├── ExtensionMethodSample.cs │ │ │ ├── LinqToObjectSample.cs │ │ │ ├── PartialMethodSample.cs │ │ │ ├── QueryExpressionSample.cs │ │ │ └── SyntaxSugarSample.cs │ │ ├── Csharp4/ │ │ │ ├── DefaultParameterSample.cs │ │ │ ├── DynamicSample.cs │ │ │ ├── VarianceSample.cs │ │ │ └── note.txt │ │ ├── Csharp5/ │ │ │ ├── AsyncSample.cs │ │ │ ├── CallerInfoSample.cs │ │ │ └── ForeachBreakingChangeSample.cs │ │ ├── Csharp6/ │ │ │ ├── AsyncSample.cs │ │ │ ├── ExtensionListInitializerSample.cs │ │ │ ├── NullConditionalSample.cs │ │ │ ├── StringInterpolationSample.cs │ │ │ └── SyntaxSugarSample.cs │ │ ├── Program.cs │ │ ├── SharedProject.projitems │ │ └── SharedProject.shproj │ ├── Ver2/ │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── Ver 2.csproj │ │ └── readme.txt │ ├── Ver2Plus/ │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── Ver 2 Plus.csproj │ │ └── readme.txt │ ├── Ver3/ │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── Ver 3.csproj │ │ ├── app.config │ │ └── readme.txt │ ├── Ver3Plus/ │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── Ver 3 Plus.csproj │ │ └── readme.txt │ ├── Ver4/ │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── Ver 4.csproj │ │ └── readme.txt │ ├── Ver4Plus/ │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── Ver 4 Plus.csproj │ │ ├── packages.config │ │ └── readme.txt │ ├── Ver4_5/ │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── Ver 4.5.csproj │ │ └── readme.txt │ ├── Ver4_5Plus/ │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── Ver 4.5 Plus.csproj │ │ └── readme.txt │ └── Ver4_6/ │ ├── Properties/ │ │ └── AssemblyInfo.cs │ ├── Ver 4.6.csproj │ └── readme.txt ├── Palindrome/ │ ├── ConsoleApplication1/ │ │ ├── App.config │ │ ├── ConsoleApplication1.csproj │ │ ├── Doc/ │ │ │ ├── Beginning.pptx │ │ │ └── Conclusion.pptx │ │ ├── Program.cs │ │ └── Properties/ │ │ └── AssemblyInfo.cs │ ├── ConsoleApplication2/ │ │ ├── App.config │ │ ├── ConsoleApplication2.csproj │ │ ├── Doc/ │ │ │ ├── Beginning.pptx │ │ │ └── Conclusion.pptx │ │ ├── Implementation1.cs │ │ ├── Program.cs │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ └── SimpleImplementation.cs │ ├── ConsoleApplication3/ │ │ ├── App.config │ │ ├── ConsoleApplication3.csproj │ │ ├── Doc/ │ │ │ ├── Beginning.pptx │ │ │ └── Conclusion.pptx │ │ ├── Implementation1.cs │ │ ├── Program.cs │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ └── SimpleImplementation.cs │ ├── ConsoleApplication4/ │ │ ├── App.config │ │ ├── ConsoleApplication4.csproj │ │ ├── Doc/ │ │ │ ├── Beginning.pptx │ │ │ └── Conclusion.pptx │ │ ├── Implementation1.cs │ │ ├── Implementation2.cs │ │ ├── Program.cs │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ └── SimpleImplementation.cs │ ├── Introduction.pptx │ └── Palindrome.sln ├── README.md ├── Scribble/ │ ├── ContextFreeTask/ │ │ ├── ContextFreeTask.sln │ │ └── SampleWpfApp1/ │ │ ├── App.xaml │ │ ├── App.xaml.cs │ │ ├── MainWindow.xaml │ │ ├── MainWindow.xaml.cs │ │ ├── Properties/ │ │ │ ├── AssemblyInfo.cs │ │ │ ├── Resources.Designer.cs │ │ │ ├── Resources.resx │ │ │ ├── Settings.Designer.cs │ │ │ └── Settings.settings │ │ ├── SampleWpfApp1.csproj │ │ ├── app.config │ │ └── project.json │ ├── FindSingleStatementBody/ │ │ ├── App.config │ │ ├── CodeAnalysisForCSharp6.csproj │ │ ├── MethodAnalyzer.cs │ │ ├── Program.cs │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── PropertyAnalysis.cs │ │ ├── SolutionLoader.cs │ │ └── packages.config │ ├── Inventories/ │ │ ├── DictionaryInventory.cs │ │ ├── Events.cs │ │ ├── IChangeable.cs │ │ ├── IIdentifiable.cs │ │ ├── IInventory.cs │ │ ├── IObservableEnumerable.cs │ │ ├── IObservableInventory.cs │ │ ├── IdComparer.cs │ │ ├── Inventories.csproj │ │ ├── ItemChangedAction.cs │ │ ├── ItemChangedArgs.cs │ │ ├── ObservableEnumerable.cs │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ └── packages.config │ ├── Inventory/ │ │ ├── App.config │ │ ├── DataModels/ │ │ │ ├── IApi.cs │ │ │ ├── SyncResult.cs │ │ │ └── Unit.cs │ │ ├── Dummy/ │ │ │ ├── DummyApi.cs │ │ │ ├── DummyMasters.cs │ │ │ └── UnitMaster.cs │ │ ├── InventoriesSample.csproj │ │ ├── Program.cs │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ └── packages.config │ ├── MigrateToProjectJson/ │ │ ├── App.config │ │ ├── MigrateToProjectJson.csproj │ │ ├── Package.cs │ │ ├── Program.cs │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── packages.config │ │ └── readme.md │ ├── OverloadResolutionWithDefaultParameter/ │ │ ├── .gitignore │ │ ├── Program.cs │ │ ├── Run.ps1 │ │ └── X/ │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── X.cs │ │ ├── X.csproj │ │ └── X.sln │ ├── Scribble.sln │ ├── UnsafeMamberAccessor/ │ │ ├── FixedPacker/ │ │ │ ├── App.config │ │ │ ├── FixedPacker.csproj │ │ │ ├── Packer.cs │ │ │ ├── Program.cs │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── Samples/ │ │ │ │ ├── DefinitionData/ │ │ │ │ │ ├── Program.cs │ │ │ │ │ └── Sample.cs │ │ │ │ └── GeneratedData/ │ │ │ │ ├── Program.cs │ │ │ │ └── Sample.cs │ │ │ ├── Unpacker.cs │ │ │ └── project.json │ │ ├── SampleApp/ │ │ │ ├── App.config │ │ │ ├── Diagnostics/ │ │ │ │ └── Measure.cs │ │ │ ├── Lib/ │ │ │ │ ├── IMemberAccessor.cs │ │ │ │ ├── IRecordAccessor.cs │ │ │ │ ├── NameIndexTable.cs │ │ │ │ ├── TypedPointer.cs │ │ │ │ └── ValueTupleAccessor.cs │ │ │ ├── Program.cs │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── SampleApp.csproj │ │ │ ├── Samples/ │ │ │ │ ├── Entry.cs │ │ │ │ └── Point.cs │ │ │ └── project.json │ │ └── UnsafeMamberAccessor.sln │ ├── ValueTuple/ │ │ ├── Program.cs │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── Reflection/ │ │ │ ├── ArrayTypeInfo.cs │ │ │ ├── IRecordAccessor.cs │ │ │ ├── Primitives.cs │ │ │ ├── RecordFieldInfo.cs │ │ │ ├── RecordTypeInfo.cs │ │ │ └── TypeRepository.cs │ │ ├── Sample/ │ │ │ ├── Fighter.cs │ │ │ ├── Mage.cs │ │ │ ├── Pair.cs │ │ │ ├── Point.cs │ │ │ ├── PolyLine.cs │ │ │ ├── Thief.cs │ │ │ └── Unit.cs │ │ ├── Serialization/ │ │ │ ├── IDeserializer.cs │ │ │ ├── ISerializer.cs │ │ │ ├── ISerializerFactory.cs │ │ │ ├── MiniMessagePack.cs │ │ │ ├── MyBinarySerializer.cs │ │ │ ├── MySerializer.cs │ │ │ ├── Number.tt │ │ │ └── Number1.cs │ │ ├── ValueTuple.csproj │ │ └── 旧/ │ │ ├── IDeepCloneable.cs │ │ ├── IRecord.cs │ │ ├── ITuple.cs │ │ ├── Line.cs │ │ ├── Person.cs │ │ ├── Point.cs │ │ ├── Program.cs │ │ ├── Serialization旧/ │ │ │ ├── IDeserializer.cs │ │ │ ├── ISerializer.cs │ │ │ └── MySerializer.cs │ │ ├── Student.cs │ │ ├── ValueTuple.cs │ │ ├── ValueTuples.cs │ │ └── ValueTuples.tt │ ├── WhereNonNull/ │ │ ├── NullableExtensions.AsEnumerable.cs │ │ ├── NullableExtensions.NonNullIterator.cs │ │ ├── NullableExtensions.NonNullStruct.cs │ │ ├── OfTypeBenchmark.cs │ │ ├── Program.cs │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── WhereNonNull.csproj │ │ └── project.json │ ├── WhereNonNull.sln │ └── readme.md ├── Style/ │ └── code.css ├── Tools/ │ ├── DnxMigration/ │ │ ├── DnxMigration.sln │ │ ├── GenerateWrapJson/ │ │ │ ├── App.config │ │ │ ├── GenerateWrapJson.csproj │ │ │ ├── Program.cs │ │ │ └── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── MigrateToMsbuild15/ │ │ │ ├── App.config │ │ │ ├── MigrateToMsbuild15.csproj │ │ │ ├── Program.cs │ │ │ └── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── MigrateToProjectJson/ │ │ │ ├── App.config │ │ │ ├── MigrateToProjectJson.csproj │ │ │ ├── Program.cs │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── project.json │ │ │ └── readme.md │ │ ├── ProjectModels/ │ │ │ ├── Csproj.cs │ │ │ ├── CsprojOutputType.cs │ │ │ ├── Package.cs │ │ │ ├── PackagesConfig.cs │ │ │ ├── ProjectJson.cs │ │ │ ├── ProjectModels.csproj │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── Solution.cs │ │ │ └── project.json │ │ ├── Test/ │ │ │ ├── App.config │ │ │ ├── Program.cs │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ └── Test.csproj │ │ └── TestData/ │ │ ├── .gitignore │ │ └── Source/ │ │ ├── .gitignore │ │ ├── ClassLibraryNet35/ │ │ │ ├── Class1.cs │ │ │ ├── ClassLibraryNet35.csproj │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ └── packages.config │ │ ├── ClassLibraryNet35X/ │ │ │ ├── Class1.cs │ │ │ ├── ClassLibraryNet35X.csproj │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ └── project.json │ │ ├── ClassLibraryNet46/ │ │ │ ├── Class1.cs │ │ │ ├── ClassLibraryNet46.csproj │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ └── packages.config │ │ ├── ClassLibraryNet46X/ │ │ │ ├── Class1.cs │ │ │ ├── ClassLibraryNet46X.csproj │ │ │ ├── ClassLibraryNet46X.xproj │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ └── project.json │ │ ├── CommonNet35/ │ │ │ ├── CommonNet35.csproj │ │ │ ├── IInterface1.cs │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ └── packages.config │ │ ├── XprojInterop.sln │ │ ├── global.json │ │ └── src/ │ │ ├── WebApplication1/ │ │ │ ├── Properties/ │ │ │ │ └── launchSettings.json │ │ │ ├── Startup.cs │ │ │ ├── WebApplication1.xproj │ │ │ ├── project.json │ │ │ └── wwwroot/ │ │ │ └── web.config │ │ └── XprojLibrary/ │ │ ├── Class1.cs │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── XprojLibrary.xproj │ │ └── project.json │ ├── KeyLogger/ │ │ ├── Gma.UserActivityMonitor/ │ │ │ ├── AssemblyInfo.cs │ │ │ ├── GlobalEventProvider.cs │ │ │ ├── Gma.UserActivityMonitor.csproj │ │ │ ├── HookManager.Callbacks.cs │ │ │ ├── HookManager.Structures.cs │ │ │ ├── HookManager.Windows.cs │ │ │ ├── HookManager.cs │ │ │ └── MouseEventExtArgs.cs │ │ ├── KeyLogger/ │ │ │ ├── App.xaml │ │ │ ├── App.xaml.cs │ │ │ ├── KeyLogger.csproj │ │ │ ├── NativeWin32.cs │ │ │ ├── Properties/ │ │ │ │ ├── AssemblyInfo.cs │ │ │ │ ├── Resources.Designer.cs │ │ │ │ ├── Resources.resx │ │ │ │ ├── Settings.Designer.cs │ │ │ │ └── Settings.settings │ │ │ ├── Window1.xaml │ │ │ └── Window1.xaml.cs │ │ └── KeyLogger.sln │ ├── ProjectReferenceGraph/ │ │ ├── Program.cs │ │ ├── Project.cs │ │ ├── ProjectReferenceGraph.csproj │ │ ├── ProjectReferenceGraph.sln │ │ └── Solution.cs │ ├── RoslynClassifier/ │ │ └── readme.md │ ├── SyntaxHighlighter/ │ │ ├── App.xaml │ │ ├── App.xaml.cs │ │ ├── AsmFormatter.cs │ │ ├── Color.cs │ │ ├── HtmlParser.cs │ │ ├── MainWindow.xaml │ │ ├── MainWindow.xaml.cs │ │ ├── Mode.cs │ │ ├── RtfParser.cs │ │ └── SyntaxHighlighter.csproj │ ├── Tools.sln │ └── UnicodeService/ │ ├── UnicodeService/ │ │ ├── Pages/ │ │ │ ├── Extensions.cs │ │ │ ├── Grapheme.cshtml │ │ │ └── Index.cshtml │ │ ├── Program.cs │ │ ├── Properties/ │ │ │ └── launchSettings.json │ │ ├── Startup.cs │ │ ├── UnicodeService.csproj │ │ ├── appsettings.Development.json │ │ ├── appsettings.json │ │ └── wwwroot/ │ │ └── css/ │ │ └── site.css │ ├── UnicodeService.sln │ └── readme.md ├── _config.yml └── docs/ └── canvas-fill-text.html ================================================ FILE CONTENTS ================================================ ================================================ FILE: .editorconfig ================================================ root = true [*.{cs,vb}] charset = utf-8 end_of_line = lf csharp_style_namespace_declarations=file_scoped:suggestion dotnet_naming_rule.private_or_internal_field_should_be_begin_with__.severity = suggestion dotnet_naming_rule.private_or_internal_field_should_be_begin_with__.symbols = private_or_internal_field dotnet_naming_rule.private_or_internal_field_should_be_begin_with__.style = begin_with__ dotnet_naming_symbols.private_or_internal_field.applicable_kinds = field dotnet_naming_symbols.private_or_internal_field.applicable_accessibilities = internal, private dotnet_naming_symbols.private_or_internal_field.required_modifiers = dotnet_naming_style.begin_with__.required_prefix = _ dotnet_naming_style.begin_with__.required_suffix = dotnet_naming_style.begin_with__.word_separator = dotnet_naming_style.begin_with__.capitalization = camel_case [*.{csproj,props,slnx}] charset = utf-8 end_of_line = lf indent_style = space indent_size = 2 ================================================ FILE: .gitattributes ================================================ ############################################################################### # Set default behavior to automatically normalize line endings. ############################################################################### * text=auto .editorconfig text eol=lf *.cs text eol=lf *.csproj text eol=lf *.props text eol=lf *.sln text eol=lf *.slnx text eol=lf *.md text eol=lf ############################################################################### # Set default behavior for command prompt diff. # # This is need for earlier builds of msysgit that does not have it on by # default for csharp files. # Note: This is only used by command line ############################################################################### #*.cs diff=csharp ############################################################################### # Set the merge driver for project and solution files # # Merging from the command prompt will add diff markers to the files if there # are conflicts (Merging from VS is not affected by the settings below, in VS # the diff markers are never inserted). Diff markers may cause the following # file extensions to fail to load in VS. An alternative would be to treat # these files as binary and thus will always conflict and require user # intervention with every merge. To do so, just uncomment the entries below ############################################################################### #*.sln merge=binary #*.csproj merge=binary #*.vbproj merge=binary #*.vcxproj merge=binary #*.vcproj merge=binary #*.dbproj merge=binary #*.fsproj merge=binary #*.lsproj merge=binary #*.wixproj merge=binary #*.modelproj merge=binary #*.sqlproj merge=binary #*.wwaproj merge=binary ############################################################################### # behavior for image files # # image files are treated as binary by default. ############################################################################### #*.jpg binary #*.png binary #*.gif binary ############################################################################### # diff behavior for common document formats # # Convert binary document formats to text before diffing them. This feature # is only available from the command line. Turn it on by uncommenting the # entries below. ############################################################################### #*.doc diff=astextplain #*.DOC diff=astextplain #*.docx diff=astextplain #*.DOCX diff=astextplain #*.dot diff=astextplain #*.DOT diff=astextplain #*.pdf diff=astextplain #*.PDF diff=astextplain #*.rtf diff=astextplain #*.RTF diff=astextplain ================================================ FILE: .github/FUNDING.yml ================================================ # These are supported funding model platforms github: ufcpp #patreon: # Replace with a single Patreon username #open_collective: # Replace with a single Open Collective username #ko_fi: # Replace with a single Ko-fi username #tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel #community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry #liberapay: # Replace with a single Liberapay username #issuehunt: # Replace with a single IssueHunt username #otechie: # Replace with a single Otechie username #custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] ================================================ FILE: .gitignore ================================================ ## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. # User-specific files *.suo *.user *.sln.docstates *.lock.json .vs BenchmarkDotNet.Artifacts # Build results [Dd]ebug/ [Dd]ebugPublic/ [Rr]elease/ [Rr]eleases/ x64/ x86/ build/ bld/ [Bb]in/ [Oo]bj/ # Roslyn cache directories *.ide/ # MSTest test Results [Tt]est[Rr]esult*/ [Bb]uild[Ll]og.* #NUNIT *.VisualState.xml TestResult.xml # Build Results of an ATL Project [Dd]ebugPS/ [Rr]eleasePS/ dlldata.c *_i.c *_p.c *_i.h *.ilk *.meta *.obj *.pch *.pdb *.pgc *.pgd *.rsp *.sbr *.tlb *.tli *.tlh *.tmp *.tmp_proj *.log *.vspscc *.vssscc .builds *.pidb *.svclog *.scc # Chutzpah Test files _Chutzpah* # Visual C++ cache files ipch/ *.aps *.ncb *.opensdf *.sdf *.cachefile # Visual Studio profiler *.psess *.vsp *.vspx # TFS 2012 Local Workspace $tf/ # Guidance Automation Toolkit *.gpState # ReSharper is a .NET coding add-in _ReSharper*/ *.[Rr]e[Ss]harper *.DotSettings.user # JustCode is a .NET coding addin-in .JustCode # TeamCity is a build add-in _TeamCity* # DotCover is a Code Coverage Tool *.dotCover # NCrunch _NCrunch_* .*crunch*.local.xml # MightyMoose *.mm.* AutoTest.Net/ # Web workbench (sass) .sass-cache/ # Installshield output folder [Ee]xpress/ # DocProject is a documentation generator add-in DocProject/buildhelp/ DocProject/Help/*.HxT DocProject/Help/*.HxC DocProject/Help/*.hhc DocProject/Help/*.hhk DocProject/Help/*.hhp DocProject/Help/Html2 DocProject/Help/html # Click-Once directory publish/ # Publish Web Output *.[Pp]ublish.xml *.azurePubxml # TODO: Comment the next line if you want to checkin your web deploy settings # but database connection strings (with potential passwords) will be unencrypted *.pubxml *.publishproj # NuGet Packages *.nupkg # The packages folder can be ignored because of Package Restore **/packages/* # except build/, which is used as an MSBuild target. !**/packages/build/ # If using the old MSBuild-Integrated Package Restore, uncomment this: #!**/packages/repositories.config # Windows Azure Build Output csx/ *.build.csdef # Windows Store app package directory AppPackages/ # Others sql/ *.Cache ClientBin/ [Ss]tyle[Cc]op.* ~$* *~ *.dbmdl *.dbproj.schemaview *.pfx *.publishsettings node_modules/ # RIA/Silverlight projects Generated_Code/ # Backup & report files from converting an old project file # to a newer Visual Studio version. Backup files are not needed, # because we have git ;-) _UpgradeReport_Files/ Backup*/ UpgradeLog*.XML UpgradeLog*.htm # SQL Server files *.mdf *.ldf # Business Intelligence projects *.rdl.data *.bim.layout *.bim_*.settings # Microsoft Fakes FakesAssemblies/ ================================================ FILE: BreakingChanges/.gitignore ================================================ *.dll ================================================ FILE: BreakingChanges/BreakingChanges.sln ================================================  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 VisualStudioVersion = 14.0.22609.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VS2008_CS3", "VS2008_CS3\VS2008_CS3.csproj", "{2C819A49-E770-42EC-A321-32FC4D28E214}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VS2010_CS4", "VS2010_CS4\VS2010_CS4.csproj", "{D18D1AE4-906E-482E-9716-744929638744}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VS2012_CS5", "VS2012_CS5\VS2012_CS5.csproj", "{B1DD6F07-3D4D-4CBD-AB00-BD1CED9741B3}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VS2015_CS6", "VS2015_CS6\VS2015_CS6.csproj", "{77FCE248-EF2D-4D3B-AB10-BC845FA01450}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {2C819A49-E770-42EC-A321-32FC4D28E214}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2C819A49-E770-42EC-A321-32FC4D28E214}.Debug|Any CPU.Build.0 = Debug|Any CPU {2C819A49-E770-42EC-A321-32FC4D28E214}.Release|Any CPU.ActiveCfg = Release|Any CPU {2C819A49-E770-42EC-A321-32FC4D28E214}.Release|Any CPU.Build.0 = Release|Any CPU {D18D1AE4-906E-482E-9716-744929638744}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D18D1AE4-906E-482E-9716-744929638744}.Debug|Any CPU.Build.0 = Debug|Any CPU {D18D1AE4-906E-482E-9716-744929638744}.Release|Any CPU.ActiveCfg = Release|Any CPU {D18D1AE4-906E-482E-9716-744929638744}.Release|Any CPU.Build.0 = Release|Any CPU {B1DD6F07-3D4D-4CBD-AB00-BD1CED9741B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B1DD6F07-3D4D-4CBD-AB00-BD1CED9741B3}.Debug|Any CPU.Build.0 = Debug|Any CPU {B1DD6F07-3D4D-4CBD-AB00-BD1CED9741B3}.Release|Any CPU.ActiveCfg = Release|Any CPU {B1DD6F07-3D4D-4CBD-AB00-BD1CED9741B3}.Release|Any CPU.Build.0 = Release|Any CPU {77FCE248-EF2D-4D3B-AB10-BC845FA01450}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {77FCE248-EF2D-4D3B-AB10-BC845FA01450}.Debug|Any CPU.Build.0 = Debug|Any CPU {77FCE248-EF2D-4D3B-AB10-BC845FA01450}.Release|Any CPU.ActiveCfg = Release|Any CPU {77FCE248-EF2D-4D3B-AB10-BC845FA01450}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal ================================================ FILE: BreakingChanges/VS2008_CS3/OverloadResolutionArraysOfPointer.cs ================================================ using System.Collections.Generic; /// /// Changed in VS 2008 SP1 /// /// #1 in https://msdn.microsoft.com/en-us/library/cc713578.aspx /// Type inference is now included on arrays of pointer types in method overload resolution. /// unsafe class OverloadResolutionArraysOfPointer { static void Main() { IEnumerable y = null; Test(y); } // Selected by Visual C# 2008 SP1. static void Test(IEnumerable x) { System.Console.WriteLine("Test(IEnumerable x)"); } // Selected by Visual C# 2005. static void Test(object o) { System.Console.WriteLine("Test(object o)"); } } ================================================ FILE: BreakingChanges/VS2008_CS3/ParamsOverride.cs ================================================ interface I { int this[int[] p] { set; } } class Base : I { // Produces CS0466: int I.this[params int[] p] { set { } } } /// /// Changed in VS 2008 SP1 /// Can be compiled in: C# 2, 3 (no SP1) /// /// #2 in https://msdn.microsoft.com/en-us/library/cc713578.aspx /// Compiler now produces error CS0466 for indexers and properties in addition to methods. /// /// /// For methods, All versions of C# compilers produce CS0466, which meets the specification. This breaking change for indexers is a bug fix. /// /// /// FYI, it is legal if the indexer is implicitly implemented: /// /// class ParamsOverride { static void Main() { } } ================================================ FILE: BreakingChanges/VS2008_CS3/VS2008_CS3.csproj ================================================  netstandard2.0 3 True ================================================ FILE: BreakingChanges/VS2010_CS4/ImplicitConversionCausedByVariance.cs ================================================ using System; using System.Collections; using System.Collections.Generic; /// /// Changed in VS 2010 /// /// In https://msdn.microsoft.com/en-us/library/vstudio/ee855831.aspx /// A new implicit conversion is added for generic interfaces and delegates such as and . /// /// /// Type parameter T of has been covariant since .NET 4 (VS 2010). /// /// s; /// /// IEnumerable x = s; // OK in all versions. IEnumerable is inherited from IEnumerable. /// IEnumerable y = s; // OK in .NET 4 or later. string is inherited from object, so IEnumerable can be treated like a subtype of IEnumerable because of covariance. /// ]]> /// class ImplicitConversionCausedByVariance { public static void Test(IEnumerable e) { Console.WriteLine("IEnumerable"); } public static void Test(IEnumerable e) { Console.WriteLine("IEnumerable"); } static void Main(string[] args) { Test(new List()); // Prints different results. // C# 2008: IEnumerable // C# 2010: IEnumerable IEnumerable strings = new List(); if (strings is IEnumerable) Console.WriteLine("True"); else Console.WriteLine("False"); // Prints different results. // C# 2008: False // C# 2010: True } } ================================================ FILE: BreakingChanges/VS2010_CS4/VS2010_CS4.csproj ================================================  netstandard2.0 4 True ================================================ FILE: BreakingChanges/VS2012_CS5/IterationVariableOfForeach.cs ================================================ using System; using System.Collections.Generic; /// /// Changed in VS 2012 /// /// In https://msdn.microsoft.com/en-us/library/hh678682(v=vs.110).aspx /// You can use the iteration variable of a foreach statement in a lambda expression that’s contained in the body of the loop. /// class IterationVariableOfForeach { static void Main() { var methods = new List(); foreach (var word in new string[] { "hello", "world" }) { methods.Add(() => Console.Write(word + " ")); } methods[0](); methods[1](); } // Output in Visual Studio 2012: // hello world // Output in Visual Studio 2010: // world world } ================================================ FILE: BreakingChanges/VS2012_CS5/VS2012_CS5.csproj ================================================  netstandard2.0 5 True ================================================ FILE: BreakingChanges/VS2015_CS6/CyclicalConstructorChaining.cs ================================================ class C { public C(int x) : this() { } public C() : this(0) { } } // In C# it is a compile-time error to write a constructor that recursively chains directly to itself //class C1 //{ // public C(int x) : this(x + 1) { } //} class CyclicalConstructorChaining { static void Main() { } } ================================================ FILE: BreakingChanges/VS2015_CS6/DefiniteAssignment.cs ================================================ /// /// Can be compiled in: C# 2, 6 /// /// https://github.com/dotnet/roslyn/blob/master/docs/compilers/CSharp/Definite%20Assignment.md /// class DefiniteAssignment { static void Main(string[] args) { int x; if (false && x == 3) // Dev10 does not consider x definitely assigned { x = x + 1; } } } ================================================ FILE: BreakingChanges/VS2015_CS6/EnumBaseTypeSystemInt32.cs ================================================ enum X : System.Int32 { A, B, C, } /// /// Can be compiled in: C# 6 /// /// Changed: enum base type can be a type expression like System.Int32 /// /// /// The ealier versions produce: /// error CS1008: Type byte, sbyte, short, ushort, int, uint, long, or ulong expected /// class EnumBaseTypeSystemInt32 { static void Main() { } } ================================================ FILE: BreakingChanges/VS2015_CS6/FuncOfFuncTypeInference.cs ================================================ using System; class FuncOfFuncTypeInference { static void Main() { X(() => () => 10); Y(() => () => 10); } private static int X(Func> f) { return f()(); } private static int X(Func> f) { return f()() ?? 0; } private static int Y(Func> f) { return f()(); } private static double Y(Func> f) { return f()(); } } ================================================ FILE: BreakingChanges/VS2015_CS6/InvariantMeaningInBlock.cs ================================================ /// /// Can be compiled in: C# 6 /// /// https://github.com/dotnet/roslyn/issues/2110 /// /// The C# specification had "invariant meaning" rule: https://msdn.microsoft.com/en-us/library/aa691351(v=vs.71).aspx /// Roslyn has gotten rid of the "invariant meaning" rule. /// class InvariantMeaningInBlock { double x; void F(bool b) { x = 1.0; if (b) { int x; x = 1; } } #if false // FYI void F1(bool b) { if (b) { int x; // generates CS0136 still in C# 6.0. x = 1; } int x = 1.0; } #endif static void Main() { var x = new InvariantMeaningInBlock(); x.F(true); x.F(false); } } ================================================ FILE: BreakingChanges/VS2015_CS6/KatakanaMiddleDot.cs ================================================ using System; /// /// Can be compiled in: C# 2, 3, 4, 5 /// /// Breaking Change in C# 6.0, Roslyn new compiler. /// Katakana Middle Dot "・" (カタカナ中点、中黒、U+30FB) no longer available for identifiers in C# 6.0. /// /// /// Katakana Middle Dot is a Japanese character whose usage is similar to hyphen in English. /// Its Unicode class was Pc (Punctuation, Connector) in Unicode 5.1 or older, but it becomes Po (Punctuation, Other). /// Pc characters can be used for C# identifiers, but Po cannot. /// 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. /// class KatakanaMiddleDot { static void Main(string[] args) { int x・y = 10; Console.WriteLine(x・y); } } ================================================ FILE: BreakingChanges/VS2015_CS6/VS2015_CS6.csproj ================================================  netstandard2.0 6 True ================================================ FILE: BreakingChanges/a.cs ================================================ using System; interface X { Func X(Func f); } class P { static void Main() { } } ================================================ FILE: BreakingChanges/csc-all.ps1 ================================================ $sourceCodes = ls *.cs -Recurse | ?{ ($_ -notmatch '\\obj\\') -and ($_ -notmatch '\\Properties\\') } foreach ($src in $sourceCodes) { cls $x = $src.FullName.Split('\\') $name = $x[$x.Length - 2] + '/' + $x[$x.Length - 1] Write-Host $name Write-Host .\read-summary.ps1 $src Write-Host .\csc.ps1 $src Write-Host Write-Host [press enter to continue] Read-Host } ================================================ FILE: BreakingChanges/csc.ps1 ================================================ param([string] $src) $compilers = @( @{ 'compiler' = $env:windir + '\Microsoft.NET\Framework64\v2.0.50727\csc.exe'; 'color' = 'DarkCyan' } @{ 'compiler' = $env:windir + '\Microsoft.NET\Framework64\v3.5\csc.exe' ; 'color' = 'DarkMagenta' } @{ 'compiler' = $env:windir + '\Microsoft.NET\Framework64\v4.0.30319\csc.exe'; 'color' = 'DarkGreen' } @{ 'compiler' = ${env:ProgramFiles(x86)} + '\MSBuild\12.0\Bin\csc.exe' ; 'color' = 'DarkRed' } @{ 'compiler' = ${env:ProgramFiles(x86)} + '\MSBuild\14.0\Bin\csc.exe' ; 'color' = 'DarkYellow' } @{ 'compiler' = ${env:ProgramFiles(x86)} + '\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\Roslyn\csc.exe' ; 'color' = 'DarkBlue' } ) $line = '━' * 40 foreach($item in $compilers) { . { $line . $item.compiler -out:out.exe $src /unsafe+ if(Test-Path out.exe) { .\out.exe [void](rm out.exe) } } | Write-Host -ForegroundColor $item.color } ================================================ FILE: BreakingChanges/read-summary.ps1 ================================================ param([string] $src) $state = 0 Get-Content $src | % { if($state -eq 0) { if($_ -match '\') { $state = 1 } } elseif($state -eq 1) { if($_ -match '\<\/summary\>') { $state = 2 } else { $_.Replace('///', '') } } } ================================================ FILE: Chapters/Algorithm/Algorithm.csproj ================================================  Exe netcoreapp3.0 disable ================================================ FILE: Chapters/Algorithm/Algorithm.sln ================================================  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 VisualStudioVersion = 14.0.23103.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Algorithm", "Algorithm.csproj", "{57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}.Debug|Any CPU.Build.0 = Debug|Any CPU {57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}.Release|Any CPU.ActiveCfg = Release|Any CPU {57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal ================================================ FILE: Chapters/Algorithm/App.config ================================================  ================================================ FILE: Chapters/Algorithm/Collections/ArrayList.cs ================================================ using System.Collections.Generic; namespace Collections { /// /// 配列リスト。 /// /// 要素の型 public class ArrayList : IEnumerable { #region フィールド T[] data; int count; #endregion #region 初期化 public ArrayList() : this(256) {} /// /// 初期最大容量を指定して初期化。 /// /// 初期最大容量 public ArrayList(int capacity) { this.data = new T[capacity]; this.count = 0; } #endregion #region プロパティ /// /// 格納されている要素数。 /// public int Count { get { return this.count; } } /// /// i 番目の要素を読み書き。 /// /// 読み書き位置 /// 読み出した要素 public T this[int i] { get { return this.data[i]; } set { this.data[i] = value; } } #endregion #region 挿入・削除 /// /// 配列を確保しなおす。 /// /// /// 配列長は2倍ずつ拡張していきます。 /// void Extend() { T[] data = new T[this.data.Length * 2]; for (int i = 0; i < this.data.Length; ++i) data[i] = this.data[i]; this.data = data; } /// /// i 番目の位置に新しい要素を追加。 /// /// 追加位置 /// 追加する要素 public void Insert(int i, T elem) { if (this.count >= this.data.Length) this.Extend(); for (int n = this.count; n > i; --n) { this.data[n] = this.data[n - 1]; } this.data[i] = elem; ++this.count; } /// /// 末尾に新しい要素を追加。 /// /// 追加する要素 public void InsertLast(T elem) { if (this.count >= this.data.Length) this.Extend(); this.data[this.count] = elem; ++this.count; } /// /// i 番目の要素を削除。 /// /// 削除位置 public void Erase(int i) { for (int n = i; n < this.count - 1; ++n) { this.data[n] = this.data[n + 1]; } --this.count; } /// /// 末尾の要素を削除。 /// public void EraseLast() { --this.count; } #endregion #region IEnumerable メンバ public IEnumerator GetEnumerator() { for (int i = 0; i < this.count; ++i) yield return this.data[i]; } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return this.GetEnumerator(); } #endregion } } ================================================ FILE: Chapters/Algorithm/Collections/BinaryTree.cs ================================================ using System; using System.Collections.Generic; using System.Text; namespace Collections { /// /// 2分探索木。 /// /// 要素の型 class BinaryTree : ISet where T: IComparable { #region 内部クラス /// /// 2文探索木のノード。 /// public class Node { #region フィールド internal T val; internal Node left, right, parent; #endregion #region 初期化 internal Node() : this(default(T), null) { } internal Node(T val, Node parent) { this.val = val; this.parent = parent; this.left = this.right = null; } #endregion #region プロパティ /// /// 格納している要素を取得。 /// public T Value { get { return this.val; } set { this.val = value; } } /// /// このノードの次のノードを返す。 /// (要素の値の小さい順にノードをたどる。) /// public Node Next { get { Node n = this; if (n.right != null) return n.right.Min; for (; n.parent != null && n.parent.left != n; n = n.parent) ; return n.parent; } } /// /// このノードの前のノードを返す。 /// (要素の値の小さい順にノードをたどる。) /// public Node Previous { get { Node n = this; if (n.left != null) return n.left.Max; for (; n.parent != null && n.parent.right != n; n = n.parent) ; return n.parent; } } /// /// このノード以下の部分木中で、最小の要素を持つノード(=左端ノード)を返す。 /// internal Node Min { get { Node n = this; for (; n.left != null; n = n.left) ; return n; } } /// /// このノード以下の部分木中で、最大の要素を持つノード(=右端ノード)を返す。 /// internal Node Max { get { Node n = this; for (; n.right != null; n = n.right) ; return n; } } #endregion #region デバッグ用 [System.Diagnostics.Conditional("DEBUG")] virtual public void Output(System.IO.TextWriter writer, int level) { for (int i = 0; i < level; ++i) writer.Write("\t"); writer.Write("{0}\n", this.val); ++level; if (this.left != null) this.left.Output(writer, level); else { for (int i = 0; i < level; ++i) writer.Write("\t"); writer.Write("null\n"); } if (this.right != null) this.right.Output(writer, level); else { for (int i = 0; i < level; ++i) writer.Write("\t"); writer.Write("null\n"); } } #endregion } #endregion #region フィールド /// /// 根ノード。 /// Node root; #endregion #region 初期化 public BinaryTree() { this.root = null; } #endregion #region プロパティ /// /// 木構造を逐次探索する際の始点。 /// public Node Begin { get { if (this.root == null) return this.End; return this.root.Min; } } /// /// 木構造を逐次探索する際の終端(末尾よりも後ろの番兵に当たるノード)。 /// public Node End { get { return null; } } #endregion #region 要素の挿入・削除・検索 /// /// 新しい要素を挿入する。 /// /// 新しい要素 /// 新しい要素を格納するノード public void Insert(T elem) { if (this.root == null) { this.root = new Node(elem, null); return; } Node n = this.root; Node p = null; while (n != null) { p = n; if (n.val.CompareTo(elem) > 0) n = n.left; else n = n.right; } n = new Node(elem, p); if (p.val.CompareTo(elem) > 0) p.left = n; else p.right = n; } /// /// n の片方の子は null、もう片方の子は m という前提の元で、 /// ノード n の位置を子ノード m で置き換える。 /// /// 削除するノード /// 置き換える子ノード void Replace(Node n, Node m) { Node p = n.parent; if (m != null) m.parent = p; if (n == this.root) this.root = m; else if (p.left == n) p.left = m; else p.right = m; } /// /// ノード n を削除する。 /// /// 削除したいノード public void Erase(Node n) { if (n == null) return; if (n.left == null) this.Replace(n, n.right); else if(n.right == null) this.Replace(n, n.left); else { Node m = n.right.Min; n.Value = m.Value; this.Replace(m, m.right); } } /// /// 要素を削除する。 /// /// 削除したい要素 public void Erase(T elem) { this.Erase(this.Find(elem)); } /// /// ある値を持つノードを検索。 /// (同じ値が複数ある場合、最初のノード。) /// 見つからなかった場合は null を返す。 /// /// 探したい要素 /// 見つけたノード public Node Find(T elem) { Node n = this.root; while (n != null) { if (n.val.CompareTo(elem) > 0) n = n.left; else if (n.val.CompareTo(elem) < 0) n = n.right; else break; } return n; } public bool Contains(T elem) { return this.Find(elem) != this.End; } /// /// ある値のノードを検索。 /// (同じ値を持つノード全部を IEnumerable で一覧として返す。) /// /// 探したい要素 /// 見つけたノード一覧 public IEnumerable FindRange(T elem) { for (Node n = this.Find(elem); n != this.End && n.Value.CompareTo(elem) == 0; n = n.Next) yield return n.Value; } #endregion #region IEnumerable メンバ public IEnumerator GetEnumerator() { for (Node n = this.Begin; n != this.End; n = n.Next) yield return n.Value; } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return this.GetEnumerator(); } #endregion #region デバッグ用 [System.Diagnostics.Conditional("DEBUG")] public void Output(System.IO.TextWriter writer) { if (this.root != null) this.root.Output(writer, 0); } #endregion } } ================================================ FILE: Chapters/Algorithm/Collections/CircularBuffer.cs ================================================ using System.Collections.Generic; namespace Collections { /// /// 循環バッファ。 /// /// 要素の型 public class CircularBuffer : IEnumerable { #region フィールド T[] data; int top, bottom; int mask; #endregion #region 初期化 public CircularBuffer() : this(256) {} /// /// 初期最大容量を指定して初期化。 /// /// 初期最大容量 public CircularBuffer(int capacity) { capacity = Pow2((uint)capacity); this.data = new T[capacity]; this.top = this.bottom = 0; this.mask = capacity - 1; } static int Pow2(uint n) { --n; int p = 0; for (; n != 0; n >>= 1) p = (p << 1) + 1; return p + 1; } #endregion #region プロパティ /// /// 格納されている要素数。 /// public int Count { get { int count = this.bottom - this.top; if (count < 0) count += this.data.Length; return count; } } /// /// i 番目の要素を読み書き。 /// /// 読み書き位置 /// 読み出した要素 public T this[int i] { get { return this.data[(i + this.top) & this.mask]; } set { this.data[(i + this.top) & this.mask] = value; } } #endregion #region 挿入・削除 /// /// 配列を確保しなおす。 /// /// /// 配列長は2倍ずつ拡張していきます。 /// void Extend() { T[] data = new T[this.data.Length * 2]; int i = 0; foreach (T elem in this) { data[i] = elem; ++i; } this.top = 0; this.bottom = this.Count; this.data = data; this.mask = data.Length - 1; } /// /// i 番目の位置に新しい要素を追加。 /// /// 追加位置 /// 追加する要素 public void Insert(int i, T elem) { if (this.Count >= this.data.Length - 1) this.Extend(); if (i < this.Count / 2) { for (int n = 0; n <= i; ++n) { this[n - 1] = this[n]; } this.top = (this.top - 1) & this.mask; this[i] = elem; } else { for (int n = this.Count; n > i; --n) { this[n] = this[n - 1]; } this[i] = elem; this.bottom = (this.bottom + 1) & this.mask; } } /// /// 先頭に新しい要素を追加。 /// /// 追加する要素 public void InsertFirst(T elem) { if (this.Count >= this.data.Length - 1) this.Extend(); this.top = (this.top - 1) & this.mask; this.data[this.top] = elem; } /// /// 末尾に新しい要素を追加。 /// /// 追加する要素 public void InsertLast(T elem) { if (this.Count >= this.data.Length - 1) this.Extend(); this.data[this.bottom] = elem; this.bottom = (this.bottom + 1) & this.mask; } /// /// i 番目の要素を削除。 /// /// 削除位置 public void Erase(int i) { for (int n = i; n < this.Count - 1; ++n) { this[n] = this[n + 1]; } this.bottom = (this.bottom - 1) & this.mask; } /// /// 先頭の要素を削除。 /// public void EraseFirst() { this.top = (this.top + 1) & this.mask; } /// /// 末尾の要素を削除。 /// public void EraseLast() { this.bottom = (this.bottom - 1) & this.mask; } #endregion #region IEnumerable メンバ public IEnumerator GetEnumerator() { if (this.top <= this.bottom) { for (int i = this.top; i < this.bottom; ++i) yield return this.data[i]; } else { for (int i = this.top; i < this.data.Length; ++i) yield return this.data[i]; for (int i = 0; i < this.bottom; ++i) yield return this.data[i]; } } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return this.GetEnumerator(); } #endregion } } ================================================ FILE: Chapters/Algorithm/Collections/Dictionary.cs ================================================ using System; using System.Collections.Generic; using System.Text; namespace Collections { /// /// 辞書。 /// /// 鍵の型 /// 値の型 public interface IDictionary : IEnumerable> { /// /// 新しい要素の挿入。 /// /// 新しい要素の鍵 /// 新しい要素の値 void Insert(TKey key, TValue val); /// /// 要素の削除。 /// /// 削除したい要素 void Erase(TKey key); /// /// 要素を含むかどうか。 /// /// 検索したい要素 /// 見つかった場合 true bool Contains(TKey key); /// /// [] を使って値を取り出す。 /// /// 鍵 /// TValue this[TKey key] { set; get; } /// /// 鍵一覧取得 /// IEnumerable Keys { get; } /// /// 値一覧取得 /// IEnumerable Values { get; } } /// /// 辞書のエントリー。 /// /// 鍵の型 /// 値の型 internal class Entry { internal TKey key; internal TValue val; internal Entry(TKey key) : this(key, default(TValue)) { } internal Entry(TKey key, TValue val) { this.key = key; this.val = val; } #region object メンバ public override int GetHashCode() { return this.key.GetHashCode(); } public override bool Equals(object obj) { Entry ent = obj as Entry; if (ent == null) return false; return this.key.Equals(ent.key); } #endregion } /// /// 辞書のエントリー。 /// (SortedArray, Tree 用) /// 鍵が IComparable を実装している必要あり。 /// /// 鍵の型 /// 値の型 internal class ComparableEntry : Entry, IComparable> where TKey : IComparable { internal ComparableEntry(TKey key) : base(key) { } internal ComparableEntry(TKey key, TValue val) : base(key, val) { } #region IComparable> メンバ public int CompareTo(ComparableEntry other) { return this.key.CompareTo(other.key); } #endregion } public class HashDictionary : IDictionary { #region フィールド HashTable> table; #endregion #region 初期化 public HashDictionary() : this(256) { } public HashDictionary(int capacity) { this.table = new HashTable>(capacity); } #endregion #region IDictionary メンバ public void Insert(TKey key, TValue val) { this.table.Insert(new Entry(key, val)); } public void Erase(TKey key) { this.table.Erase(new Entry(key)); } public bool Contains(TKey key) { return this.table.Contains(new Entry(key)); } public TValue this[TKey key] { get { Entry entry = this.table.Find(new Entry(key)); if (entry == null) return default(TValue); return entry.val; } set { Entry entry = this.table.Find(new Entry(key)); if (entry == null) this.Insert(key, value); else entry.val = value; } } public IEnumerable Keys { get { foreach (Entry ent in this.table) { yield return ent.key; } } } public IEnumerable Values { get { foreach (Entry ent in this.table) { yield return ent.val; } } } #endregion #region IEnumerable メンバ public IEnumerator> GetEnumerator() { foreach (Entry ent in this.table) { yield return new KeyValuePair(ent.key, ent.val); } } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return this.GetEnumerator(); } #endregion } public class SortedDictionary : IDictionary where TKey : IComparable { #region フィールド SortedArray> table; #endregion #region 初期化 public SortedDictionary() : this(256) { } public SortedDictionary(int capacity) { this.table = new SortedArray>(capacity); } #endregion #region IDictionary メンバ public void Insert(TKey key, TValue val) { this.table.Insert(new ComparableEntry(key, val)); } public void Erase(TKey key) { this.table.Erase(new ComparableEntry(key)); } public bool Contains(TKey key) { return this.table.Contains(new ComparableEntry(key)); } public TValue this[TKey key] { get { ComparableEntry entry = this.table.Find(new ComparableEntry(key)); if (entry == null) return default(TValue); return entry.val; } set { ComparableEntry entry = this.table.Find(new ComparableEntry(key)); if (entry == null) this.Insert(key, value); else entry.val = value; } } public IEnumerable Keys { get { foreach (Entry ent in this.table) { yield return ent.key; } } } public IEnumerable Values { get { foreach (Entry ent in this.table) { yield return ent.val; } } } #endregion #region IEnumerable メンバ public IEnumerator> GetEnumerator() { foreach (Entry ent in this.table) { yield return new KeyValuePair(ent.key, ent.val); } } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return this.GetEnumerator(); } #endregion } public class TreeDictionary : IDictionary where TKey : IComparable { #region フィールド BinaryTree> table; #endregion #region 初期化 public TreeDictionary() { this.table = new BinaryTree>(); } #endregion #region IDictionary メンバ public void Insert(TKey key, TValue val) { this.table.Insert(new ComparableEntry(key, val)); } public void Erase(TKey key) { this.table.Erase(new ComparableEntry(key)); } public bool Contains(TKey key) { return this.table.Contains(new ComparableEntry(key)); } public TValue this[TKey key] { get { BinaryTree>.Node node = this.table.Find(new ComparableEntry(key)); if (node == null) return default(TValue); return node.Value.val; } set { BinaryTree>.Node node = this.table.Find(new ComparableEntry(key)); if (node == null) this.Insert(key, value); else node.Value.val = value; } } public IEnumerable Keys { get { foreach (Entry ent in this.table) { yield return ent.key; } } } public IEnumerable Values { get { foreach (Entry ent in this.table) { yield return ent.val; } } } #endregion #region IEnumerable メンバ public IEnumerator> GetEnumerator() { foreach (Entry ent in this.table) { yield return new KeyValuePair(ent.key, ent.val); } } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return this.GetEnumerator(); } #endregion } } ================================================ FILE: Chapters/Algorithm/Collections/ForwardLinkedList.cs ================================================ using System.Collections.Generic; namespace Collections { /// /// 片方向連結リスト。 /// /// 要素の型 public class ForwardLinkedList : IEnumerable { #region 内部クラス /// /// 片方向連結リストのノード。 /// public class Node { #region フィールド T val; Node next; #endregion #region 初期化 internal Node(T val, Node next) { this.val = val; this.next = next; } #endregion #region プロパティ /// /// 格納している要素を取得。 /// public T Value { get { return this.val; } set { this.val = value; } } /// /// 次のノード。 /// public Node Next { get { return this.next; } internal set { this.next = value; } } #endregion } #endregion #region フィールド Node first; #endregion #region 初期化 public ForwardLinkedList() { this.first = null; } #endregion #region プロパティ /// /// リストの先頭ノード。 /// public Node First { get { return this.first; } } /// /// 要素の個数。 /// public int Count { get { int i = 0; for(Node n = this.first; n!=null; n=n.Next) ++i; return i; } } #endregion #region 挿入・削除 /// /// ノード n の後ろに新しい要素を追加。 /// /// 要素の挿入位置 /// 新しい要素 /// 新しく挿入されたノード public Node InsertAfter(Node n, T elem) { Node m = new Node(elem, n.Next); n.Next = m; return m; } /// /// 先頭に新しい要素を追加。 /// /// 新しい要素 /// 新しく挿入されたノード public Node InsertFirst(T elem) { Node m = new Node(elem, this.first); this.first = m; return m; } /// /// ノード n の後ろの要素を削除。 /// /// 要素の削除位置 public void EraseAfter(Node n) { if (n != null && n.Next != null) n.Next = n.Next.Next; } /// /// ノード n の自身を削除。 /// /// 要素の削除位置 /// 削除した要素の次のノード public Node Erase(Node n) { Node prev = this.first; for (; prev != null && prev.Next != n; prev = prev.Next) ; if (prev == this.first) { this.first = null; return null; } if (prev != null) { this.EraseAfter(prev); return prev.Next; } return null; } /// /// 先頭の要素を削除。 /// public void EraseFirst() { if (this.first != null) this.first = this.first.Next; } #endregion #region IEnumerable メンバ public IEnumerator GetEnumerator() { for (Node n = this.first; n != null; n = n.Next) yield return n.Value; } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return this.GetEnumerator(); } #endregion } } ================================================ FILE: Chapters/Algorithm/Collections/HashTable.cs ================================================ using System; using System.Collections.Generic; using System.Text; namespace Collections { /// /// ハッシュテーブル。 /// /// 要素の型 class HashTable : ISet { #region 内部クラス class Node { internal T val; internal Node next; internal Node(T val, Node next) { this.val = val; this.next = next; } } #endregion #region フィールド Node[] table; int mask; #endregion #region 初期化 public HashTable() : this(256) { } public HashTable(int capacity) { capacity = Pow2((uint)capacity); this.mask = capacity - 1; this.table = new Node[capacity]; } static int Pow2(uint n) { --n; int p = 0; for (; n != 0; n >>= 1) p = (p << 1) + 1; return p + 1; } #endregion #region 挿入・削除・検索 /// /// 要素の挿入。 /// /// 挿入する要素 public void Insert(T elem) { int code = elem.GetHashCode() & this.mask; Node n = this.table[code]; Node m = new Node(elem, n); m.next = n; this.table[code] = m; } /// /// 要素の削除。 /// /// 削除する要素 public void Erase(T elem) { int code = elem.GetHashCode() & this.mask; Node n = this.table[code]; if (n == null) return; if (n.next == null) this.table[code] = null; while (n.next != null && n.next.val.Equals(elem)) n = n.next; if(n.next != null) n.next = n.next.next; } /// /// テーブル中に要素が含まれているかどうか判別。 /// /// 探したい要素 /// 含まれていれば true public bool Contains(T elem) { int code = elem.GetHashCode() & this.mask; Node n = this.table[code]; while (n != null && !n.val.Equals(elem)) n = n.next; return n != null; } /// /// テーブル中の要素を検索。 /// /// 探したい要素 /// 含まれていればその要素を、なければ default(T) public T Find(T elem) { int code = elem.GetHashCode(); Node n = this.table[code & this.mask]; while (n != null && !n.val.Equals(elem)) n = n.next; if (n == null) return default(T); return n.val; } #endregion #region IEnumerable メンバ public IEnumerator GetEnumerator() { for (int i = 0; i < this.table.Length; ++i) for (Node n = this.table[i]; n != null; n = n.next) yield return n.val; } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return this.GetEnumerator(); } #endregion } } ================================================ FILE: Chapters/Algorithm/Collections/LinkedList.cs ================================================ using System.Collections.Generic; namespace Collections { /// /// 双方向連結リスト。 /// /// 要素の型 public class LinkedList : IEnumerable { #region 内部クラス /// /// 連結リストのノード。 /// public class Node { #region フィールド T val; Node prev; Node next; #endregion #region 初期化 internal Node(T val, Node prev, Node next) { this.val = val; this.prev = prev; this.next = next; } #endregion #region プロパティ /// /// 格納している要素を取得。 /// public T Value { get { return this.val; } set { this.val = value; } } /// /// 次のノード。 /// public Node Next { get { return this.next; } internal set { this.next = value; } } /// /// 次のノード。 /// public Node Previous { get { return this.prev; } internal set { this.prev = value; } } #endregion } #endregion #region フィールド Node dummy; #endregion #region 初期化 public LinkedList() { this.dummy = new Node(default(T), null, null); this.dummy.Next = this.dummy; this.dummy.Previous = this.dummy; } #endregion #region プロパティ /// /// リストの先頭ノード。 /// public Node First { get { return this.dummy.Next; } } /// /// リストの末尾ノード。 /// public Node Last { get { return this.dummy.Previous; } } /// /// リストの終端(末尾よりも後ろの番兵に当たるノード)。 /// public Node End { get { return this.dummy; } } /// /// 要素の個数。 /// public int Count { get { int i = 0; for (Node n = this.First; n != this.End; n = n.Next) ++i; return i; } } #endregion #region 挿入・削除 /// /// ノード n の後ろに新しい要素を追加。 /// /// 要素の挿入位置 /// 新しい要素 /// 新しく挿入されたノード public Node InsertAfter(Node n, T elem) { Node m = new Node(elem, n, n.Next); n.Next.Previous = m; n.Next = m; return m; } /// /// ノード n の前に新しい要素を追加。 /// /// 要素の挿入位置 /// 新しい要素 /// 新しく挿入されたノード public Node InsertBefore(Node n, T elem) { Node m = new Node(elem, n.Previous, n); n.Previous.Next = m; n.Previous = m; return m; } /// /// 先頭に新しい要素を追加。 /// /// 新しい要素 /// 新しく挿入されたノード public Node InsertFirst(T elem) { return this.InsertAfter(this.dummy, elem); } /// /// 末尾に新しい要素を追加。 /// /// 新しい要素 /// 新しく挿入されたノード public Node InsertLast(T elem) { return this.InsertBefore(this.dummy, elem); } /// /// ノード n の自身を削除。 /// /// 要素の削除位置 /// 削除した要素の次のノード public Node Erase(Node n) { if (n == this.dummy) { return this.dummy; } n.Previous.Next = n.Next; n.Next.Previous = n.Previous; return n.Next; } /// /// 先頭の要素を削除。 /// public void EraseFirst() { this.Erase(this.First); } /// /// 末尾の要素を削除。 /// public void EraseLast() { this.Erase(this.Last); } #endregion #region IEnumerable メンバ public IEnumerator GetEnumerator() { for (Node n = this.First; n != this.End; n = n.Next) yield return n.Value; } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return this.GetEnumerator(); } #endregion } } ================================================ FILE: Chapters/Algorithm/Collections/PriorityQueue.cs ================================================ using System; using System.Collections.Generic; using System.Text; namespace Collections { /// /// 優先度付き待ち行列 /// /// 要素の型 class PriorityQueue where T : IComparable { #region フィールド ArrayList buffer; #endregion #region 初期化 public PriorityQueue() { this.buffer = new ArrayList(); } public PriorityQueue(int capacity) { this.buffer = new ArrayList(capacity); } #endregion #region ヒープ操作 /// /// ヒープ化されている配列リストに新しい要素を追加する。 /// /// 対象の配列リスト static void PushHeap(ArrayList array, T elem) { int n = array.Count; array.InsertLast(elem); while (n != 0) { int i = (n - 1) / 2; if (array[n].CompareTo(array[i]) > 0) { T tmp = array[n]; array[n] = array[i]; array[i] = tmp; } n = i; } } /// /// ヒープから最大値を削除する。 /// /// 対象の配列リスト static void PopHeap(ArrayList array) { int n = array.Count - 1; array[0] = array[n]; array.EraseLast(); for (int i = 0, j; (j = 2 * i + 1) < n; ) { if ((j != n - 1) && (array[j].CompareTo(array[j + 1]) < 0)) j++; if (array[i].CompareTo(array[j]) < 0) { T tmp = array[j]; array[j] = array[i]; array[i] = tmp; } i = j; } } #endregion #region 要素の挿入・削除 /// /// 要素のプッシュ。 /// /// 挿入したい要素 public void Push(T elem) { PushHeap(this.buffer, elem); } /// /// 要素を1つポップ。 /// /// /// 今回の実装では、先頭要素の読み出しと削除は別に行う。 /// この Pop では削除のみ。 /// 読み出しには Top プロパティを使う。 /// public void Pop() { PopHeap(this.buffer); } /// /// 先頭要素の読み出し。 /// public T Top { get { return this.buffer[0]; } } public int Count { get { return this.buffer.Count; } } #endregion } } ================================================ FILE: Chapters/Algorithm/Collections/Queue.cs ================================================ using System; using System.Collections.Generic; using System.Text; namespace Collections { /// /// スタック(FILOバッファ)。 /// /// 要素の型 class Queue { #region フィールド CircularBuffer buffer; #endregion #region 初期化 public Queue() { this.buffer = new CircularBuffer(); } public Queue(int capacity) { this.buffer = new CircularBuffer(capacity); } #endregion #region 要素の挿入・削除 /// /// 要素のエンキュー。 /// /// 挿入したい要素 /// /// 名前は Stack に合わせて Push にしてある。 /// public void Push(T elem) { this.buffer.InsertLast(elem); } /// /// 要素を1つデキュー。 /// /// /// 名前は Stack に合わせて Pop にしてある。 /// 今回の実装では、先頭要素の読み出しと削除は別に行う。 /// この Pop では削除のみ。 /// 読み出しには Top プロパティを使う。 /// public void Pop() { this.buffer.EraseFirst(); } /// /// 先頭要素の読み出し。 /// public T Top { get { return this.buffer[0]; } } public int Count { get { return this.buffer.Count; } } #endregion } } ================================================ FILE: Chapters/Algorithm/Collections/Set.cs ================================================ using System.Collections.Generic; namespace Collections { /// /// セット。 /// 数学で「集合」と呼ぶ奴。 /// 要素の順序には意味がなくて、要素が含まれているかどうかだけが問題。 /// /// 要素の型 interface ISet : IEnumerable { void Insert(T elem); void Erase(T elem); bool Contains(T elem); } } ================================================ FILE: Chapters/Algorithm/Collections/SortedArray.cs ================================================ using System; using System.Collections.Generic; namespace Collections { /// /// ソート済み配列。 /// /// 要素の型 /// /// 2分探索できるので、検索は O(log n)。 /// ソート済みの状態を保つため、要素の挿入・削除には O(n) 必要。 /// class SortedArray : ISet where T: IComparable { #region フィールド ArrayList buffer; #endregion #region 初期化 public SortedArray() : this(256) { } public SortedArray(int capacity) { this.buffer = new ArrayList(capacity); } #endregion #region 要素の挿入・削除・検索 /// /// 要素の挿入。 /// /// 挿入する要素 public void Insert(T elem) { if (this.buffer.Count == 0) { this.buffer.InsertLast(elem); return; } int r = this.buffer.Count - 1; int l = 0; int comp; while (l < r) { int m = (r + l) >> 1; comp = this.buffer[m].CompareTo(elem); if (comp > 0) r = m - 1; else if (comp < 0) l = m + 1; else return; // 重複不可 } comp = this.buffer[l].CompareTo(elem); if(comp < 0) this.buffer.Insert(l + 1, elem); else if(comp > 0) this.buffer.Insert(l, elem); } /// /// 要素の検索。 /// /// 検索する要素 /// 要素の位置(見つからなかった場合、配列長) public int IndexOf(T elem) { if (this.buffer.Count == 0) return 0; int r = this.buffer.Count - 1; int l = 0; while (l < r) { int m = (r + l) >> 1; int comp = this.buffer[m].CompareTo(elem); if (comp > 0) r = m - 1; else if (comp < 0) l = m + 1; else return m; } if(this.buffer[l].CompareTo(elem) == 0) return l; return this.buffer.Count; } /// /// テーブル中に要素が含まれているかどうか判別。 /// /// 探したい要素 /// 含まれていれば true public bool Contains(T elem) { return this.IndexOf(elem) != this.buffer.Count; } /// /// テーブル中の要素を検索。 /// /// 探したい要素 /// 含まれていればその要素を、なければ default(T) public T Find(T elem) { int i = this.IndexOf(elem); if (i == this.buffer.Count) return default(T); return this.buffer[i]; } /// /// 要素の削除。 /// /// 削除する要素 public void Erase(T elem) { int i = this.IndexOf(elem); if (i < this.buffer.Count) this.buffer.Erase(i); } #endregion #region IEnumerable メンバ public IEnumerator GetEnumerator() { for (int i = 0; i < this.buffer.Count; ++i) yield return this.buffer[i]; } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return this.GetEnumerator(); } #endregion } } ================================================ FILE: Chapters/Algorithm/Collections/Stack.cs ================================================ using System; using System.Collections.Generic; using System.Text; namespace Collections { /// /// スタック(FILOバッファ)。 /// /// 要素の型 class Stack { #region フィールド ArrayList buffer; #endregion #region 初期化 public Stack() { this.buffer = new ArrayList(); } public Stack(int capacity) { this.buffer = new ArrayList(capacity); } #endregion #region 要素の挿入・削除 /// /// 要素のプッシュ。 /// /// 挿入したい要素 public void Push(T elem) { this.buffer.InsertLast(elem); } /// /// 要素を1つポップ。 /// /// /// 今回の実装では、先頭要素の読み出しと削除は別に行う。 /// この Pop では削除のみ。 /// 読み出しには Top プロパティを使う。 /// public void Pop() { this.buffer.EraseLast(); } /// /// 先頭要素の読み出し。 /// public T Top { get { return this.buffer[this.buffer.Count - 1]; } } public int Count { get { return this.buffer.Count; } } #endregion } } ================================================ FILE: Chapters/Algorithm/Program.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Algorithm { class Program { static void Main(string[] args) { } } } ================================================ FILE: Chapters/Algorithm/Sort/BubbleSort.cs ================================================ using System; namespace Algorithm.Sort { partial class Sort { /// /// バブルソート。 /// /// 対象の配列 public static void BubbleSort(T[] a) where T : IComparable { int n = a.Length; for (int i = 0; i < n - 1; i++) for (int j = n - 1; j > i; j--) if (a[j].CompareTo(a[j - 1]) < 0) Swap(ref a[j], ref a[j - 1]); } } } ================================================ FILE: Chapters/Algorithm/Sort/BucketSort.cs ================================================ using System.Collections.Generic; namespace Algorithm.Sort { partial class Sort { /// /// [0, max] の範囲の整数をバケットソート。 /// /// 対象の配列 /// 配列 a 中の最大値 public static void BucketSort(int[] a, int max) { // バケツを用意 int[] bucket = new int[max + 1]; // バケツに値を入れる for (int i = 0; i < a.Length; ++i) ++bucket[a[i]]; // バケツ中の値の結合 for (int j = 0, i = 0; j < bucket.Length; ++j) for (int k = bucket[j]; k != 0; --k, ++i) a[i] = j; } /// /// [0, max] の範囲の整数をキーに持つデータ構造をバケットソート。 /// /// 値の型 /// 対象の配列 /// キーの最大値 public static void BucketSort(KeyValuePair[] a, int max) { // バケツを用意 List[] bucket = new List[max + 1]; // バケツに値を入れる for (int i = 0; i < a.Length; ++i) { if (bucket[a[i].Key] == null) bucket[a[i].Key] = new List(); bucket[a[i].Key].Add(a[i].Value); } // バケツ中の値の結合 for (int j = 0, i = 0; j < bucket.Length; ++j) if (bucket[j] != null) foreach (T val in bucket[j]) a[i++] = new KeyValuePair(j, val); } } } ================================================ FILE: Chapters/Algorithm/Sort/HeapSort.cs ================================================ using System; namespace Algorithm.Sort { partial class Sort { /// /// ヒープソート。 /// /// 対象の配列 public static void HeapSort(T[] a) where T : IComparable { for (int i = 1; i < a.Length; ++i) MakeHeap(a, i); for (int i = a.Length - 1; i >= 0; --i) a[i] = PopHeap(a, i); } /// /// 配列をヒープ化する。 /// n - 1 番目までの要素は既にヒープ化されていることを仮定して、 /// n 番目の要素をヒープに追加。 /// /// 対象の配列 /// 要素数 static void MakeHeap(T[] a, int n) where T : IComparable { while (n != 0) { int i = (n - 1) / 2; if (a[n].CompareTo(a[i]) > 0) Swap(ref a[n], ref a[i]); n = i; } } /// /// ヒープから最大値を取り出す。 /// /// 対象の配列 /// 要素数 - 1 /// 取り出した最大値 static T PopHeap(T[] a, int n) where T : IComparable { T max = a[0]; a[0] = a[n]; for (int i = 0, j; (j = 2 * i + 1) < n;) { if ((j != n - 1) && (a[j].CompareTo(a[j + 1]) < 0)) j++; if (a[i].CompareTo(a[j]) < 0) Swap(ref a[i], ref a[j]); i = j; } return max; } } } ================================================ FILE: Chapters/Algorithm/Sort/InsertSort.cs ================================================ using System; namespace Algorithm.Sort { partial class Sort { /// /// 挿入ソート。 /// /// 対象の配列 public static void InsertSort(T[] a) where T : IComparable { int n = a.Length; for (int i = 1; i < n; i++) for (int j = i; j >= 1 && a[j - 1].CompareTo(a[j]) > 0; --j) Swap(ref a[j], ref a[j - 1]); } /// /// 挿入ソート。 /// 配列のどこからどこまでをソートするかを指定するバージョン。 /// , /// /// 対象の配列 /// ソート対象の先頭インデックス /// ソート対象の末尾インデックス static void InsertSort(T[] a, int first, int last) where T : IComparable { for (int i = first + 1; i <= last; i++) for (int j = i; j > first && a[j - 1].CompareTo(a[j]) > 0; --j) Swap(ref a[j], ref a[j - 1]); } } } ================================================ FILE: Chapters/Algorithm/Sort/MergeSort.cs ================================================ using System; namespace Algorithm.Sort { partial class Sort { /// /// マージソート。 /// /// 対象の配列 public static void MergeSort(T[] a) where T : IComparable { T[] work = new T[a.Length / 2]; MergeSort(a, 0, a.Length, work); } /// /// マージソート → 挿入ソートに切り替える配列長の閾値。 /// const int MERGE_THREASHOLD = 64; /// /// マージソート。 /// 配列のどこからどこまでをソートするかを指定するバージョン。 /// /// 対象の配列 /// ソート対象部分の先頭 /// ソート対象部分の末尾+1 /// 作業領域。a の 1/2 のサイズが必要。 static void MergeSort(T[] a, int begin, int end, T[] work) where T : IComparable { if (end - begin < MERGE_THREASHOLD) { InsertSort(a, begin, end - 1); return; } int mid = (begin + end) / 2; MergeSort(a, begin, mid, work); MergeSort(a, mid, end, work); Merge(a, begin, mid, end, work); } /// /// 配列 a の、[begin, mid) の部分と [mid, end) の部分をマージ。 /// /// /// マージ対象の配列 /// aの先頭 /// aの分割点 /// aの末尾+1 /// 作業領域 static void Merge(T[] a, int begin, int mid, int end, T[] work) where T : IComparable { int i, j, k; for (i = begin, j = 0; i != mid; ++i, ++j) work[j] = a[i]; mid -= begin; for (j = 0, k = begin; i != end && j != mid; ++k) { if (a[i].CompareTo(work[j]) < 0) { a[k] = a[i]; ++i; } else { a[k] = work[j]; ++j; } } for (; i < end; ++i, ++k) a[k] = a[i]; for (; j < mid; ++j, ++k) a[k] = work[j]; } } } ================================================ FILE: Chapters/Algorithm/Sort/QuickSort.cs ================================================ using System; namespace Algorithm.Sort { partial class Sort { /// /// クイックソート。 /// /// 対象の配列 public static void QuickSort(T[] a) where T : IComparable { QuickSort(a, 0, a.Length - 1); } /// /// クイックソート → 挿入ソートに切り替える配列長の閾値。 /// const int QUICK_THREASHOLD = 64; /// /// クイックソート本体。 /// 配列のどこからどこまでをソートするかを指定するバージョン。 /// /// 対象の配列 /// ソート対象の先頭インデックス /// ソート対象の末尾インデックス static void QuickSort(T[] a, int first, int last) where T : IComparable { // 要素数が少なくなってきたら挿入ソートに切り替え if (last - first < QUICK_THREASHOLD) { InsertSort(a, first, last); return; } // 枢軸決定(配列の先頭、ど真ん中、末尾の3つの値の中央値を使用。) T pivot = Median(a[first], a[(first + last) / 2], a[last]); // 左右分割 int l = first; int r = last; while (l <= r) { while (l < last && a[l].CompareTo(pivot) < 0) l++; while (r > first && a[r].CompareTo(pivot) >= 0) r--; if (l > r) break; Swap(ref a[l], ref a[r]); l++; r--; } // 再帰呼び出し QuickSort(a, first, l - 1); QuickSort(a, l, last); } /// /// 3つの値の中央値を求める。 /// /// オペランドa /// オペランドb /// オペランドc /// 中央値 static T Median(T a, T b, T c) where T : IComparable { if (a.CompareTo(b) > 0) Swap(ref a, ref b); if (a.CompareTo(c) > 0) Swap(ref a, ref c); if (b.CompareTo(c) > 0) Swap(ref b, ref c); return b; } } } ================================================ FILE: Chapters/Algorithm/Sort/RadixSort.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Algorithm.Sort { partial class Sort { /// /// 基数ソート。 /// 概念説明用の簡易版。 /// 10進数で3桁(0~999)までしかソートできない。 /// /// 対象の配列 /// 配列 a 中の最大値 public static void RadixSort10(int[] a) { // バケツを用意 List[] bucket = new List[10]; for (int d = 0, r = 1; d < 3; ++d, r *= 10) { // バケツに値を入れる for (int i = 0; i < a.Length; ++i) { int key = (a[i] / r) % 10; // a[i] の d 桁目だけを取り出す。 if (bucket[key] == null) bucket[key] = new List(); bucket[key].Add(a[i]); } // バケツ中の値の結合 for (int j = 0, i = 0; j < bucket.Length; ++j) if (bucket[j] != null) foreach (int val in bucket[j]) a[i++] = val; // バケツを一度空にする for (int j = 0; j < bucket.Length; ++j) bucket[j] = null; } } /// /// 基数ソート。 /// /// 対象の配列 /// 配列 a 中の最大値 public static void RadixSort(int[] a) { // バケツを用意 List[] bucket = new List[256]; for (int d = 0, logR = 0; d < 4; ++d, logR += 8) { // バケツに値を入れる for (int i = 0; i < a.Length; ++i) { int key = (a[i] >> logR) & 255; // a[i] を256進 d 桁目だけを取り出す。 if (bucket[key] == null) bucket[key] = new List(); bucket[key].Add(a[i]); } // バケツ中の値の結合 for (int j = 0, i = 0; j < bucket.Length; ++j) if (bucket[j] != null) foreach (int val in bucket[j]) a[i++] = val; // バケツを一度空にする for (int j = 0; j < bucket.Length; ++j) bucket[j] = null; } } } } ================================================ FILE: Chapters/Algorithm/Sort/SelectSort.cs ================================================ using System; namespace Algorithm.Sort { partial class Sort { /// /// 選択ソート。 /// /// 対象の配列 public static void SelectSort(T[] a) where T : IComparable { int n = a.Length; for (int i = 0; i < n; i++) { int min = i; for (int j = i + 1; j < n; j++) if (a[min].CompareTo(a[j]) > 0) min = j; Swap(ref a[i], ref a[min]); } } } } ================================================ FILE: Chapters/Algorithm/Sort/ShellSort.cs ================================================ using System; namespace Algorithm.Sort { partial class Sort { /// /// シェルソート。 /// /// 対象の配列 public static void ShellSort(T[] a) where T : IComparable { int n = a.Length; int h; for (h = 1; h < n / 9; h = h * 3 + 1) ; for (; h > 0; h /= 3) for (int i = h; i < n; i++) for (int j = i; j >= h && a[j - h].CompareTo(a[j]) > 0; j -= h) Swap(ref a[j], ref a[j - h]); } } } ================================================ FILE: Chapters/Algorithm/Sort/Sort.cs ================================================ using System; namespace Algorithm.Sort { partial class Sort { private static void Swap(ref T t1, ref T t2) where T : IComparable { var t = t1; t1 = t2; t2 = t; } } } ================================================ FILE: Chapters/AllInOne.sln ================================================  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.28407.52 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Async", "Async", "{2ED58793-4F5C-43C8-95B2-ACE56426DF10}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Lock", "Async\Lock\Lock.csproj", "{93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TaskLike", "Async\TaskLike\TaskLike.csproj", "{1395B24A-5B30-4312-8D8B-17AD0FF0B64B}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Data", "Data", "{F1D776AA-9064-489C-92C4-9671FB7761AA}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Deconstruction", "Data\Deconstruction\Deconstruction.csproj", "{A3E46235-D020-4AEC-918A-F315DA6E9012}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discards", "Data\Discards\Discards.csproj", "{80197711-36D4-4A93-B75B-3B6DDD4799A7}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OutVar", "Data\OutVar\OutVar.csproj", "{4A20CE71-0214-4289-A730-0D90C5E009B7}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tuples", "Data\Tuples\Tuples.csproj", "{9851C940-EF7D-414C-89DC-441A3B22B5B5}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TypeSwitch", "Data\TypeSwitch\TypeSwitch.csproj", "{A953159C-7BFB-4BF2-897D-45FE4886C2F1}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Event", "Event", "{4E9F5E97-2C87-4A72-B90C-7B6645EA372B}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventDriven", "Event\EventDriven\EventDriven.csproj", "{B9F1BFC7-12D7-4434-8335-DDC9E7D0F9D7}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Observable", "Event\Observable\Observable.csproj", "{9DA4DAFA-81CA-47C6-B953-A7D1AD376429}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Functional", "Functional", "{F3EA519B-5D56-4099-94D7-CB390289D130}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ExtensionMethods", "Functional\ExtensionMethods\ExtensionMethods.csproj", "{6F25470E-E1AB-4254-A8D1-68E6CD40A38B}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LocalFunctions", "Functional\LocalFunctions\LocalFunctions.csproj", "{B1636BC9-0B5A-4FED-9E19-8CD0957737B3}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Interop", "Interop", "{48EB640A-D40F-433F-ACF7-A6360228DE5C}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Win32Dll", "Interop\Win32Dll\Win32Dll.vcxproj", "{4C367220-4A86-4F8F-94A4-E303A882EC38}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Unsafe", "Interop\Unsafe\Unsafe\Unsafe.csproj", "{F9244ECD-9764-466C-8346-BFC5DDB7AAD9}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TypedReference", "Interop\TypedReference\TypedReference.csproj", "{FFB96C42-7EF5-4A9D-9D50-DBBD001D840A}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MemoryManagement", "MemoryManagement", "{C53EC418-52D5-4539-8926-EFA66AB51C91}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UninitializedMemory", "MemoryManagement\UninitializedMemory\UninitializedMemory.vcxproj", "{5846FD63-297A-41FE-BDCF-5E1A44418953}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DefaultValue", "MemoryManagement\DefaultValue\DefaultValue.csproj", "{012FD17A-1F55-4BB6-B923-BEF210AD83B1}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Misc", "Misc", "{A1594DA0-6962-4715-B63D-DD8474D529CE}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Keywords", "Misc\Keywords\Keywords.csproj", "{F324CA0E-2847-4B65-A84B-0350026F563C}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Oop", "Oop", "{D865F0C6-CEB1-4142-A138-EC0E8A53B23B}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GenericsSample", "Oop\GenericsSample\GenericsSample.csproj", "{4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "InterfaceSample", "Oop\InterfaceSample\InterfaceSample.csproj", "{BFFD4218-2CD6-488E-A01F-77B4DA544F20}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ValueTypeGenerics", "Oop\ValueTypeGenerics\ValueTypeGenerics.csproj", "{AC426EA1-3118-4A20-BC62-0EAB2F82A17A}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Variance", "Oop\Variance\Variance.csproj", "{491A0653-DCF1-43A9-8589-E5422E7C9279}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TopLevelAccessibility", "TopLevelAccessibility", "{168983F2-7C04-43CC-A84D-F815E3BCAF30}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ReferredClassLibrary", "Oop\TopLevelAccessibility\ReferredClassLibrary\ReferredClassLibrary.csproj", "{56B750BA-36B5-453C-A288-4783C48F9FD4}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConsoleApplication", "Oop\TopLevelAccessibility\ConsoleApplication\ConsoleApplication.csproj", "{1E06949A-F394-4BE8-853A-94BBAB8AA836}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Resource", "Resource", "{E8980CC4-17BE-48D9-ADA1-6ADB28E3E076}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Boxing", "Resource\Boxing\Boxing.csproj", "{EB51A057-60F6-44C8-AEDD-6591B5DC88A8}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ByRef", "Resource\ByRef\ByRef.csproj", "{DAB14A91-2EB1-493C-A5B9-E846E1299938}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ClassOrStruct", "Resource\ClassOrStruct\ClassOrStruct.csproj", "{F937FF67-EC5A-4F85-8DFC-843EF96FAE16}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RecursiveReadOnly", "Resource\RecursiveReadOnly\RecursiveReadOnly.csproj", "{B78D2711-96CB-4FA9-BB46-2B61142FA7C4}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RefAndPointer", "Resource\RefAndPointer\RefAndPointer.csproj", "{33541ADA-A350-4C7E-AA45-BA1565A885E1}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Span", "Resource\Span\Span.csproj", "{7236CBC9-6395-4D97-A934-98798CCD5F27}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StructLayoutSample", "Resource\StructLayoutSample\StructLayoutSample.csproj", "{D5D09AA6-99FE-43B3-9EEE-44E5DDBB8EEC}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StructPerformance", "Resource\StructPerformance\StructPerformance.csproj", "{4E3E8CFD-6DB9-4D95-845D-1E955796C061}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WeakReference", "Resource\WeakReference\WeakReference.csproj", "{83481B0E-62A6-4427-B645-FCE090A3F8C3}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Start", "Start", "{0B4399BF-B82E-437D-BC87-AD363FEC9B4F}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IdentifierScope", "Start\IdentifierScope\IdentifierScope.csproj", "{183C51EE-B17B-4607-991B-16A01FE5A66E}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Variables", "Start\Variables\Variables.csproj", "{C1933686-B6BC-49A4-87FA-69AAB0C1500B}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StructuredProgramming", "StructuredProgramming", "{5D997394-516B-4C50-83F8-49766EE5FD09}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BackportEnumerable", "StructuredProgramming\BackportEnumerable\BackportEnumerable.csproj", "{B63BA635-EA21-4D00-B7C1-2104FCDD169D}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Exceptions", "StructuredProgramming\Exceptions\Exceptions.csproj", "{AB9184CF-DAE4-4F7A-BF14-7E7140C2DD57}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Expressions", "StructuredProgramming\Expressions\Expressions.csproj", "{99FD4D50-6E34-4C43-9730-DAB97F81ED8B}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ExternAliasConsoleApplication", "StructuredProgramming\ExternAliasConsoleApplication\ExternAliasConsoleApplication.csproj", "{134218F9-5B38-4E19-A74D-F05A3F179B53}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Function", "StructuredProgramming\Function\Function.csproj", "{6F24F522-37B0-422E-93F2-F9617C253987}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Inlining", "StructuredProgramming\Inlining\Inlining.csproj", "{575D7157-6997-4BDA-840A-D272EEDBACBD}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Namespaces", "StructuredProgramming\Namespaces\Namespaces.csproj", "{44CB7746-43BB-47FD-B2B9-D0CD2E15E2AA}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Params", "StructuredProgramming\Params\Params.csproj", "{9ED86973-D986-40DD-9068-627FE33D9F5A}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tuples", "StructuredProgramming\Tuples\Tuples.csproj", "{33BE0F4E-B7DC-45F1-8386-CC79EAD1E185}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LambdaInternal", "Functional\LambdaInternal\LambdaInternal.csproj", "{7C9B9329-6ADC-4BCB-860A-312F727F0DAD}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DelegateInternal", "Functional\DelegateInternal\DelegateInternal.csproj", "{D83A7939-277A-4AA6-8EFC-1A0ABEAAD638}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Algorithm", "Algorithm", "{603BF91B-95EB-478E-9CBE-21B85C671BD8}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Algorithm", "Algorithm\Algorithm.csproj", "{57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Patterns", "Data\Patterns\Patterns.csproj", "{CFBBEA8F-75B8-4952-AD74-8A5997E374B9}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NativeLib", "Interop\NativeMemory\NativeLib\NativeLib.vcxproj", "{2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ManagedApp", "Interop\NativeMemory\ManagedApp\ManagedApp.csproj", "{8522EEF7-9D46-424E-A75B-5F2366228316}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NativeInterop", "Interop\NativeInterop\NativeInterop.csproj", "{A61313F7-3BEF-4321-B8E3-4E49E71E1502}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NativeMemory", "NativeMemory", "{BA683E0C-98ED-402B-9141-1B9DAD7B929A}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PatternBased", "Misc\PatternBased\PatternBased.csproj", "{3A4328F3-8559-4943-8677-1B31FEE9F739}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StringInterplation", "Start\StringInterplation\StringInterplation.csproj", "{36830F66-D52D-4294-B393-749FB829342C}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OverloadResolution", "StructuredProgramming\OverloadResolution\OverloadResolution\OverloadResolution.csproj", "{4E377107-E269-4A9A-BD67-DA2F437D20E6}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}.Debug|Any CPU.Build.0 = Debug|Any CPU {93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}.Debug|x64.ActiveCfg = Debug|Any CPU {93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}.Debug|x64.Build.0 = Debug|Any CPU {93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}.Debug|x86.ActiveCfg = Debug|Any CPU {93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}.Debug|x86.Build.0 = Debug|Any CPU {93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}.Release|Any CPU.ActiveCfg = Release|Any CPU {93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}.Release|Any CPU.Build.0 = Release|Any CPU {93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}.Release|x64.ActiveCfg = Release|Any CPU {93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}.Release|x64.Build.0 = Release|Any CPU {93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}.Release|x86.ActiveCfg = Release|Any CPU {93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}.Release|x86.Build.0 = Release|Any CPU {1395B24A-5B30-4312-8D8B-17AD0FF0B64B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1395B24A-5B30-4312-8D8B-17AD0FF0B64B}.Debug|Any CPU.Build.0 = Debug|Any CPU {1395B24A-5B30-4312-8D8B-17AD0FF0B64B}.Debug|x64.ActiveCfg = Debug|Any CPU {1395B24A-5B30-4312-8D8B-17AD0FF0B64B}.Debug|x64.Build.0 = Debug|Any CPU {1395B24A-5B30-4312-8D8B-17AD0FF0B64B}.Debug|x86.ActiveCfg = Debug|Any CPU {1395B24A-5B30-4312-8D8B-17AD0FF0B64B}.Debug|x86.Build.0 = Debug|Any CPU {1395B24A-5B30-4312-8D8B-17AD0FF0B64B}.Release|Any CPU.ActiveCfg = Release|Any CPU {1395B24A-5B30-4312-8D8B-17AD0FF0B64B}.Release|Any CPU.Build.0 = Release|Any CPU {1395B24A-5B30-4312-8D8B-17AD0FF0B64B}.Release|x64.ActiveCfg = Release|Any CPU {1395B24A-5B30-4312-8D8B-17AD0FF0B64B}.Release|x64.Build.0 = Release|Any CPU {1395B24A-5B30-4312-8D8B-17AD0FF0B64B}.Release|x86.ActiveCfg = Release|Any CPU {1395B24A-5B30-4312-8D8B-17AD0FF0B64B}.Release|x86.Build.0 = Release|Any CPU {A3E46235-D020-4AEC-918A-F315DA6E9012}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A3E46235-D020-4AEC-918A-F315DA6E9012}.Debug|Any CPU.Build.0 = Debug|Any CPU {A3E46235-D020-4AEC-918A-F315DA6E9012}.Debug|x64.ActiveCfg = Debug|Any CPU {A3E46235-D020-4AEC-918A-F315DA6E9012}.Debug|x64.Build.0 = Debug|Any CPU {A3E46235-D020-4AEC-918A-F315DA6E9012}.Debug|x86.ActiveCfg = Debug|Any CPU {A3E46235-D020-4AEC-918A-F315DA6E9012}.Debug|x86.Build.0 = Debug|Any CPU {A3E46235-D020-4AEC-918A-F315DA6E9012}.Release|Any CPU.ActiveCfg = Release|Any CPU {A3E46235-D020-4AEC-918A-F315DA6E9012}.Release|Any CPU.Build.0 = Release|Any CPU {A3E46235-D020-4AEC-918A-F315DA6E9012}.Release|x64.ActiveCfg = Release|Any CPU {A3E46235-D020-4AEC-918A-F315DA6E9012}.Release|x64.Build.0 = Release|Any CPU {A3E46235-D020-4AEC-918A-F315DA6E9012}.Release|x86.ActiveCfg = Release|Any CPU {A3E46235-D020-4AEC-918A-F315DA6E9012}.Release|x86.Build.0 = Release|Any CPU {80197711-36D4-4A93-B75B-3B6DDD4799A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {80197711-36D4-4A93-B75B-3B6DDD4799A7}.Debug|Any CPU.Build.0 = Debug|Any CPU {80197711-36D4-4A93-B75B-3B6DDD4799A7}.Debug|x64.ActiveCfg = Debug|Any CPU {80197711-36D4-4A93-B75B-3B6DDD4799A7}.Debug|x64.Build.0 = Debug|Any CPU {80197711-36D4-4A93-B75B-3B6DDD4799A7}.Debug|x86.ActiveCfg = Debug|Any CPU {80197711-36D4-4A93-B75B-3B6DDD4799A7}.Debug|x86.Build.0 = Debug|Any CPU {80197711-36D4-4A93-B75B-3B6DDD4799A7}.Release|Any CPU.ActiveCfg = Release|Any CPU {80197711-36D4-4A93-B75B-3B6DDD4799A7}.Release|Any CPU.Build.0 = Release|Any CPU {80197711-36D4-4A93-B75B-3B6DDD4799A7}.Release|x64.ActiveCfg = Release|Any CPU {80197711-36D4-4A93-B75B-3B6DDD4799A7}.Release|x64.Build.0 = Release|Any CPU {80197711-36D4-4A93-B75B-3B6DDD4799A7}.Release|x86.ActiveCfg = Release|Any CPU {80197711-36D4-4A93-B75B-3B6DDD4799A7}.Release|x86.Build.0 = Release|Any CPU {4A20CE71-0214-4289-A730-0D90C5E009B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4A20CE71-0214-4289-A730-0D90C5E009B7}.Debug|Any CPU.Build.0 = Debug|Any CPU {4A20CE71-0214-4289-A730-0D90C5E009B7}.Debug|x64.ActiveCfg = Debug|Any CPU {4A20CE71-0214-4289-A730-0D90C5E009B7}.Debug|x64.Build.0 = Debug|Any CPU {4A20CE71-0214-4289-A730-0D90C5E009B7}.Debug|x86.ActiveCfg = Debug|Any CPU {4A20CE71-0214-4289-A730-0D90C5E009B7}.Debug|x86.Build.0 = Debug|Any CPU {4A20CE71-0214-4289-A730-0D90C5E009B7}.Release|Any CPU.ActiveCfg = Release|Any CPU {4A20CE71-0214-4289-A730-0D90C5E009B7}.Release|Any CPU.Build.0 = Release|Any CPU {4A20CE71-0214-4289-A730-0D90C5E009B7}.Release|x64.ActiveCfg = Release|Any CPU {4A20CE71-0214-4289-A730-0D90C5E009B7}.Release|x64.Build.0 = Release|Any CPU {4A20CE71-0214-4289-A730-0D90C5E009B7}.Release|x86.ActiveCfg = Release|Any CPU {4A20CE71-0214-4289-A730-0D90C5E009B7}.Release|x86.Build.0 = Release|Any CPU {9851C940-EF7D-414C-89DC-441A3B22B5B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9851C940-EF7D-414C-89DC-441A3B22B5B5}.Debug|Any CPU.Build.0 = Debug|Any CPU {9851C940-EF7D-414C-89DC-441A3B22B5B5}.Debug|x64.ActiveCfg = Debug|Any CPU {9851C940-EF7D-414C-89DC-441A3B22B5B5}.Debug|x64.Build.0 = Debug|Any CPU {9851C940-EF7D-414C-89DC-441A3B22B5B5}.Debug|x86.ActiveCfg = Debug|Any CPU {9851C940-EF7D-414C-89DC-441A3B22B5B5}.Debug|x86.Build.0 = Debug|Any CPU {9851C940-EF7D-414C-89DC-441A3B22B5B5}.Release|Any CPU.ActiveCfg = Release|Any CPU {9851C940-EF7D-414C-89DC-441A3B22B5B5}.Release|Any CPU.Build.0 = Release|Any CPU {9851C940-EF7D-414C-89DC-441A3B22B5B5}.Release|x64.ActiveCfg = Release|Any CPU {9851C940-EF7D-414C-89DC-441A3B22B5B5}.Release|x64.Build.0 = Release|Any CPU {9851C940-EF7D-414C-89DC-441A3B22B5B5}.Release|x86.ActiveCfg = Release|Any CPU {9851C940-EF7D-414C-89DC-441A3B22B5B5}.Release|x86.Build.0 = Release|Any CPU {A953159C-7BFB-4BF2-897D-45FE4886C2F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A953159C-7BFB-4BF2-897D-45FE4886C2F1}.Debug|Any CPU.Build.0 = Debug|Any CPU {A953159C-7BFB-4BF2-897D-45FE4886C2F1}.Debug|x64.ActiveCfg = Debug|Any CPU {A953159C-7BFB-4BF2-897D-45FE4886C2F1}.Debug|x64.Build.0 = Debug|Any CPU {A953159C-7BFB-4BF2-897D-45FE4886C2F1}.Debug|x86.ActiveCfg = Debug|Any CPU {A953159C-7BFB-4BF2-897D-45FE4886C2F1}.Debug|x86.Build.0 = Debug|Any CPU {A953159C-7BFB-4BF2-897D-45FE4886C2F1}.Release|Any CPU.ActiveCfg = Release|Any CPU {A953159C-7BFB-4BF2-897D-45FE4886C2F1}.Release|Any CPU.Build.0 = Release|Any CPU {A953159C-7BFB-4BF2-897D-45FE4886C2F1}.Release|x64.ActiveCfg = Release|Any CPU {A953159C-7BFB-4BF2-897D-45FE4886C2F1}.Release|x64.Build.0 = Release|Any CPU {A953159C-7BFB-4BF2-897D-45FE4886C2F1}.Release|x86.ActiveCfg = Release|Any CPU {A953159C-7BFB-4BF2-897D-45FE4886C2F1}.Release|x86.Build.0 = Release|Any CPU {B9F1BFC7-12D7-4434-8335-DDC9E7D0F9D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B9F1BFC7-12D7-4434-8335-DDC9E7D0F9D7}.Debug|Any CPU.Build.0 = Debug|Any CPU {B9F1BFC7-12D7-4434-8335-DDC9E7D0F9D7}.Debug|x64.ActiveCfg = Debug|Any CPU {B9F1BFC7-12D7-4434-8335-DDC9E7D0F9D7}.Debug|x64.Build.0 = Debug|Any CPU {B9F1BFC7-12D7-4434-8335-DDC9E7D0F9D7}.Debug|x86.ActiveCfg = Debug|Any CPU {B9F1BFC7-12D7-4434-8335-DDC9E7D0F9D7}.Debug|x86.Build.0 = Debug|Any CPU {B9F1BFC7-12D7-4434-8335-DDC9E7D0F9D7}.Release|Any CPU.ActiveCfg = Release|Any CPU {B9F1BFC7-12D7-4434-8335-DDC9E7D0F9D7}.Release|Any CPU.Build.0 = Release|Any CPU {B9F1BFC7-12D7-4434-8335-DDC9E7D0F9D7}.Release|x64.ActiveCfg = Release|Any CPU {B9F1BFC7-12D7-4434-8335-DDC9E7D0F9D7}.Release|x64.Build.0 = Release|Any CPU {B9F1BFC7-12D7-4434-8335-DDC9E7D0F9D7}.Release|x86.ActiveCfg = Release|Any CPU {B9F1BFC7-12D7-4434-8335-DDC9E7D0F9D7}.Release|x86.Build.0 = Release|Any CPU {9DA4DAFA-81CA-47C6-B953-A7D1AD376429}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9DA4DAFA-81CA-47C6-B953-A7D1AD376429}.Debug|Any CPU.Build.0 = Debug|Any CPU {9DA4DAFA-81CA-47C6-B953-A7D1AD376429}.Debug|x64.ActiveCfg = Debug|Any CPU {9DA4DAFA-81CA-47C6-B953-A7D1AD376429}.Debug|x64.Build.0 = Debug|Any CPU {9DA4DAFA-81CA-47C6-B953-A7D1AD376429}.Debug|x86.ActiveCfg = Debug|Any CPU {9DA4DAFA-81CA-47C6-B953-A7D1AD376429}.Debug|x86.Build.0 = Debug|Any CPU {9DA4DAFA-81CA-47C6-B953-A7D1AD376429}.Release|Any CPU.ActiveCfg = Release|Any CPU {9DA4DAFA-81CA-47C6-B953-A7D1AD376429}.Release|Any CPU.Build.0 = Release|Any CPU {9DA4DAFA-81CA-47C6-B953-A7D1AD376429}.Release|x64.ActiveCfg = Release|Any CPU {9DA4DAFA-81CA-47C6-B953-A7D1AD376429}.Release|x64.Build.0 = Release|Any CPU {9DA4DAFA-81CA-47C6-B953-A7D1AD376429}.Release|x86.ActiveCfg = Release|Any CPU {9DA4DAFA-81CA-47C6-B953-A7D1AD376429}.Release|x86.Build.0 = Release|Any CPU {6F25470E-E1AB-4254-A8D1-68E6CD40A38B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6F25470E-E1AB-4254-A8D1-68E6CD40A38B}.Debug|Any CPU.Build.0 = Debug|Any CPU {6F25470E-E1AB-4254-A8D1-68E6CD40A38B}.Debug|x64.ActiveCfg = Debug|Any CPU {6F25470E-E1AB-4254-A8D1-68E6CD40A38B}.Debug|x64.Build.0 = Debug|Any CPU {6F25470E-E1AB-4254-A8D1-68E6CD40A38B}.Debug|x86.ActiveCfg = Debug|Any CPU {6F25470E-E1AB-4254-A8D1-68E6CD40A38B}.Debug|x86.Build.0 = Debug|Any CPU {6F25470E-E1AB-4254-A8D1-68E6CD40A38B}.Release|Any CPU.ActiveCfg = Release|Any CPU {6F25470E-E1AB-4254-A8D1-68E6CD40A38B}.Release|Any CPU.Build.0 = Release|Any CPU {6F25470E-E1AB-4254-A8D1-68E6CD40A38B}.Release|x64.ActiveCfg = Release|Any CPU {6F25470E-E1AB-4254-A8D1-68E6CD40A38B}.Release|x64.Build.0 = Release|Any CPU {6F25470E-E1AB-4254-A8D1-68E6CD40A38B}.Release|x86.ActiveCfg = Release|Any CPU {6F25470E-E1AB-4254-A8D1-68E6CD40A38B}.Release|x86.Build.0 = Release|Any CPU {B1636BC9-0B5A-4FED-9E19-8CD0957737B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B1636BC9-0B5A-4FED-9E19-8CD0957737B3}.Debug|Any CPU.Build.0 = Debug|Any CPU {B1636BC9-0B5A-4FED-9E19-8CD0957737B3}.Debug|x64.ActiveCfg = Debug|Any CPU {B1636BC9-0B5A-4FED-9E19-8CD0957737B3}.Debug|x64.Build.0 = Debug|Any CPU {B1636BC9-0B5A-4FED-9E19-8CD0957737B3}.Debug|x86.ActiveCfg = Debug|Any CPU {B1636BC9-0B5A-4FED-9E19-8CD0957737B3}.Debug|x86.Build.0 = Debug|Any CPU {B1636BC9-0B5A-4FED-9E19-8CD0957737B3}.Release|Any CPU.ActiveCfg = Release|Any CPU {B1636BC9-0B5A-4FED-9E19-8CD0957737B3}.Release|Any CPU.Build.0 = Release|Any CPU {B1636BC9-0B5A-4FED-9E19-8CD0957737B3}.Release|x64.ActiveCfg = Release|Any CPU {B1636BC9-0B5A-4FED-9E19-8CD0957737B3}.Release|x64.Build.0 = Release|Any CPU {B1636BC9-0B5A-4FED-9E19-8CD0957737B3}.Release|x86.ActiveCfg = Release|Any CPU {B1636BC9-0B5A-4FED-9E19-8CD0957737B3}.Release|x86.Build.0 = Release|Any CPU {4C367220-4A86-4F8F-94A4-E303A882EC38}.Debug|Any CPU.ActiveCfg = Debug|Win32 {4C367220-4A86-4F8F-94A4-E303A882EC38}.Debug|x64.ActiveCfg = Debug|x64 {4C367220-4A86-4F8F-94A4-E303A882EC38}.Debug|x64.Build.0 = Debug|x64 {4C367220-4A86-4F8F-94A4-E303A882EC38}.Debug|x86.ActiveCfg = Debug|Win32 {4C367220-4A86-4F8F-94A4-E303A882EC38}.Debug|x86.Build.0 = Debug|Win32 {4C367220-4A86-4F8F-94A4-E303A882EC38}.Release|Any CPU.ActiveCfg = Release|Win32 {4C367220-4A86-4F8F-94A4-E303A882EC38}.Release|x64.ActiveCfg = Release|x64 {4C367220-4A86-4F8F-94A4-E303A882EC38}.Release|x64.Build.0 = Release|x64 {4C367220-4A86-4F8F-94A4-E303A882EC38}.Release|x86.ActiveCfg = Release|Win32 {4C367220-4A86-4F8F-94A4-E303A882EC38}.Release|x86.Build.0 = Release|Win32 {F9244ECD-9764-466C-8346-BFC5DDB7AAD9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F9244ECD-9764-466C-8346-BFC5DDB7AAD9}.Debug|Any CPU.Build.0 = Debug|Any CPU {F9244ECD-9764-466C-8346-BFC5DDB7AAD9}.Debug|x64.ActiveCfg = Debug|Any CPU {F9244ECD-9764-466C-8346-BFC5DDB7AAD9}.Debug|x64.Build.0 = Debug|Any CPU {F9244ECD-9764-466C-8346-BFC5DDB7AAD9}.Debug|x86.ActiveCfg = Debug|Any CPU {F9244ECD-9764-466C-8346-BFC5DDB7AAD9}.Debug|x86.Build.0 = Debug|Any CPU {F9244ECD-9764-466C-8346-BFC5DDB7AAD9}.Release|Any CPU.ActiveCfg = Release|Any CPU {F9244ECD-9764-466C-8346-BFC5DDB7AAD9}.Release|Any CPU.Build.0 = Release|Any CPU {F9244ECD-9764-466C-8346-BFC5DDB7AAD9}.Release|x64.ActiveCfg = Release|Any CPU {F9244ECD-9764-466C-8346-BFC5DDB7AAD9}.Release|x64.Build.0 = Release|Any CPU {F9244ECD-9764-466C-8346-BFC5DDB7AAD9}.Release|x86.ActiveCfg = Release|Any CPU {F9244ECD-9764-466C-8346-BFC5DDB7AAD9}.Release|x86.Build.0 = Release|Any CPU {FFB96C42-7EF5-4A9D-9D50-DBBD001D840A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FFB96C42-7EF5-4A9D-9D50-DBBD001D840A}.Debug|Any CPU.Build.0 = Debug|Any CPU {FFB96C42-7EF5-4A9D-9D50-DBBD001D840A}.Debug|x64.ActiveCfg = Debug|Any CPU {FFB96C42-7EF5-4A9D-9D50-DBBD001D840A}.Debug|x64.Build.0 = Debug|Any CPU {FFB96C42-7EF5-4A9D-9D50-DBBD001D840A}.Debug|x86.ActiveCfg = Debug|Any CPU {FFB96C42-7EF5-4A9D-9D50-DBBD001D840A}.Debug|x86.Build.0 = Debug|Any CPU {FFB96C42-7EF5-4A9D-9D50-DBBD001D840A}.Release|Any CPU.ActiveCfg = Release|Any CPU {FFB96C42-7EF5-4A9D-9D50-DBBD001D840A}.Release|Any CPU.Build.0 = Release|Any CPU {FFB96C42-7EF5-4A9D-9D50-DBBD001D840A}.Release|x64.ActiveCfg = Release|Any CPU {FFB96C42-7EF5-4A9D-9D50-DBBD001D840A}.Release|x64.Build.0 = Release|Any CPU {FFB96C42-7EF5-4A9D-9D50-DBBD001D840A}.Release|x86.ActiveCfg = Release|Any CPU {FFB96C42-7EF5-4A9D-9D50-DBBD001D840A}.Release|x86.Build.0 = Release|Any CPU {5846FD63-297A-41FE-BDCF-5E1A44418953}.Debug|Any CPU.ActiveCfg = Debug|Win32 {5846FD63-297A-41FE-BDCF-5E1A44418953}.Debug|x64.ActiveCfg = Debug|Win32 {5846FD63-297A-41FE-BDCF-5E1A44418953}.Debug|x86.ActiveCfg = Debug|Win32 {5846FD63-297A-41FE-BDCF-5E1A44418953}.Debug|x86.Build.0 = Debug|Win32 {5846FD63-297A-41FE-BDCF-5E1A44418953}.Release|Any CPU.ActiveCfg = Release|Win32 {5846FD63-297A-41FE-BDCF-5E1A44418953}.Release|x64.ActiveCfg = Release|Win32 {5846FD63-297A-41FE-BDCF-5E1A44418953}.Release|x86.ActiveCfg = Release|Win32 {5846FD63-297A-41FE-BDCF-5E1A44418953}.Release|x86.Build.0 = Release|Win32 {012FD17A-1F55-4BB6-B923-BEF210AD83B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {012FD17A-1F55-4BB6-B923-BEF210AD83B1}.Debug|Any CPU.Build.0 = Debug|Any CPU {012FD17A-1F55-4BB6-B923-BEF210AD83B1}.Debug|x64.ActiveCfg = Debug|Any CPU {012FD17A-1F55-4BB6-B923-BEF210AD83B1}.Debug|x64.Build.0 = Debug|Any CPU {012FD17A-1F55-4BB6-B923-BEF210AD83B1}.Debug|x86.ActiveCfg = Debug|Any CPU {012FD17A-1F55-4BB6-B923-BEF210AD83B1}.Debug|x86.Build.0 = Debug|Any CPU {012FD17A-1F55-4BB6-B923-BEF210AD83B1}.Release|Any CPU.ActiveCfg = Release|Any CPU {012FD17A-1F55-4BB6-B923-BEF210AD83B1}.Release|Any CPU.Build.0 = Release|Any CPU {012FD17A-1F55-4BB6-B923-BEF210AD83B1}.Release|x64.ActiveCfg = Release|Any CPU {012FD17A-1F55-4BB6-B923-BEF210AD83B1}.Release|x64.Build.0 = Release|Any CPU {012FD17A-1F55-4BB6-B923-BEF210AD83B1}.Release|x86.ActiveCfg = Release|Any CPU {012FD17A-1F55-4BB6-B923-BEF210AD83B1}.Release|x86.Build.0 = Release|Any CPU {F324CA0E-2847-4B65-A84B-0350026F563C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F324CA0E-2847-4B65-A84B-0350026F563C}.Debug|Any CPU.Build.0 = Debug|Any CPU {F324CA0E-2847-4B65-A84B-0350026F563C}.Debug|x64.ActiveCfg = Debug|Any CPU {F324CA0E-2847-4B65-A84B-0350026F563C}.Debug|x64.Build.0 = Debug|Any CPU {F324CA0E-2847-4B65-A84B-0350026F563C}.Debug|x86.ActiveCfg = Debug|Any CPU {F324CA0E-2847-4B65-A84B-0350026F563C}.Debug|x86.Build.0 = Debug|Any CPU {F324CA0E-2847-4B65-A84B-0350026F563C}.Release|Any CPU.ActiveCfg = Release|Any CPU {F324CA0E-2847-4B65-A84B-0350026F563C}.Release|Any CPU.Build.0 = Release|Any CPU {F324CA0E-2847-4B65-A84B-0350026F563C}.Release|x64.ActiveCfg = Release|Any CPU {F324CA0E-2847-4B65-A84B-0350026F563C}.Release|x64.Build.0 = Release|Any CPU {F324CA0E-2847-4B65-A84B-0350026F563C}.Release|x86.ActiveCfg = Release|Any CPU {F324CA0E-2847-4B65-A84B-0350026F563C}.Release|x86.Build.0 = Release|Any CPU {4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}.Debug|Any CPU.Build.0 = Debug|Any CPU {4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}.Debug|x64.ActiveCfg = Debug|Any CPU {4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}.Debug|x64.Build.0 = Debug|Any CPU {4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}.Debug|x86.ActiveCfg = Debug|Any CPU {4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}.Debug|x86.Build.0 = Debug|Any CPU {4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}.Release|Any CPU.ActiveCfg = Release|Any CPU {4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}.Release|Any CPU.Build.0 = Release|Any CPU {4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}.Release|x64.ActiveCfg = Release|Any CPU {4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}.Release|x64.Build.0 = Release|Any CPU {4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}.Release|x86.ActiveCfg = Release|Any CPU {4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}.Release|x86.Build.0 = Release|Any CPU {BFFD4218-2CD6-488E-A01F-77B4DA544F20}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BFFD4218-2CD6-488E-A01F-77B4DA544F20}.Debug|Any CPU.Build.0 = Debug|Any CPU {BFFD4218-2CD6-488E-A01F-77B4DA544F20}.Debug|x64.ActiveCfg = Debug|Any CPU {BFFD4218-2CD6-488E-A01F-77B4DA544F20}.Debug|x64.Build.0 = Debug|Any CPU {BFFD4218-2CD6-488E-A01F-77B4DA544F20}.Debug|x86.ActiveCfg = Debug|Any CPU {BFFD4218-2CD6-488E-A01F-77B4DA544F20}.Debug|x86.Build.0 = Debug|Any CPU {BFFD4218-2CD6-488E-A01F-77B4DA544F20}.Release|Any CPU.ActiveCfg = Release|Any CPU {BFFD4218-2CD6-488E-A01F-77B4DA544F20}.Release|Any CPU.Build.0 = Release|Any CPU {BFFD4218-2CD6-488E-A01F-77B4DA544F20}.Release|x64.ActiveCfg = Release|Any CPU {BFFD4218-2CD6-488E-A01F-77B4DA544F20}.Release|x64.Build.0 = Release|Any CPU {BFFD4218-2CD6-488E-A01F-77B4DA544F20}.Release|x86.ActiveCfg = Release|Any CPU {BFFD4218-2CD6-488E-A01F-77B4DA544F20}.Release|x86.Build.0 = Release|Any CPU {AC426EA1-3118-4A20-BC62-0EAB2F82A17A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AC426EA1-3118-4A20-BC62-0EAB2F82A17A}.Debug|Any CPU.Build.0 = Debug|Any CPU {AC426EA1-3118-4A20-BC62-0EAB2F82A17A}.Debug|x64.ActiveCfg = Debug|Any CPU {AC426EA1-3118-4A20-BC62-0EAB2F82A17A}.Debug|x64.Build.0 = Debug|Any CPU {AC426EA1-3118-4A20-BC62-0EAB2F82A17A}.Debug|x86.ActiveCfg = Debug|Any CPU {AC426EA1-3118-4A20-BC62-0EAB2F82A17A}.Debug|x86.Build.0 = Debug|Any CPU {AC426EA1-3118-4A20-BC62-0EAB2F82A17A}.Release|Any CPU.ActiveCfg = Release|Any CPU {AC426EA1-3118-4A20-BC62-0EAB2F82A17A}.Release|Any CPU.Build.0 = Release|Any CPU {AC426EA1-3118-4A20-BC62-0EAB2F82A17A}.Release|x64.ActiveCfg = Release|Any CPU {AC426EA1-3118-4A20-BC62-0EAB2F82A17A}.Release|x64.Build.0 = Release|Any CPU {AC426EA1-3118-4A20-BC62-0EAB2F82A17A}.Release|x86.ActiveCfg = Release|Any CPU {AC426EA1-3118-4A20-BC62-0EAB2F82A17A}.Release|x86.Build.0 = Release|Any CPU {491A0653-DCF1-43A9-8589-E5422E7C9279}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {491A0653-DCF1-43A9-8589-E5422E7C9279}.Debug|Any CPU.Build.0 = Debug|Any CPU {491A0653-DCF1-43A9-8589-E5422E7C9279}.Debug|x64.ActiveCfg = Debug|Any CPU {491A0653-DCF1-43A9-8589-E5422E7C9279}.Debug|x64.Build.0 = Debug|Any CPU {491A0653-DCF1-43A9-8589-E5422E7C9279}.Debug|x86.ActiveCfg = Debug|Any CPU {491A0653-DCF1-43A9-8589-E5422E7C9279}.Debug|x86.Build.0 = Debug|Any CPU {491A0653-DCF1-43A9-8589-E5422E7C9279}.Release|Any CPU.ActiveCfg = Release|Any CPU {491A0653-DCF1-43A9-8589-E5422E7C9279}.Release|Any CPU.Build.0 = Release|Any CPU {491A0653-DCF1-43A9-8589-E5422E7C9279}.Release|x64.ActiveCfg = Release|Any CPU {491A0653-DCF1-43A9-8589-E5422E7C9279}.Release|x64.Build.0 = Release|Any CPU {491A0653-DCF1-43A9-8589-E5422E7C9279}.Release|x86.ActiveCfg = Release|Any CPU {491A0653-DCF1-43A9-8589-E5422E7C9279}.Release|x86.Build.0 = Release|Any CPU {56B750BA-36B5-453C-A288-4783C48F9FD4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {56B750BA-36B5-453C-A288-4783C48F9FD4}.Debug|Any CPU.Build.0 = Debug|Any CPU {56B750BA-36B5-453C-A288-4783C48F9FD4}.Debug|x64.ActiveCfg = Debug|Any CPU {56B750BA-36B5-453C-A288-4783C48F9FD4}.Debug|x64.Build.0 = Debug|Any CPU {56B750BA-36B5-453C-A288-4783C48F9FD4}.Debug|x86.ActiveCfg = Debug|Any CPU {56B750BA-36B5-453C-A288-4783C48F9FD4}.Debug|x86.Build.0 = Debug|Any CPU {56B750BA-36B5-453C-A288-4783C48F9FD4}.Release|Any CPU.ActiveCfg = Release|Any CPU {56B750BA-36B5-453C-A288-4783C48F9FD4}.Release|Any CPU.Build.0 = Release|Any CPU {56B750BA-36B5-453C-A288-4783C48F9FD4}.Release|x64.ActiveCfg = Release|Any CPU {56B750BA-36B5-453C-A288-4783C48F9FD4}.Release|x64.Build.0 = Release|Any CPU {56B750BA-36B5-453C-A288-4783C48F9FD4}.Release|x86.ActiveCfg = Release|Any CPU {56B750BA-36B5-453C-A288-4783C48F9FD4}.Release|x86.Build.0 = Release|Any CPU {1E06949A-F394-4BE8-853A-94BBAB8AA836}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1E06949A-F394-4BE8-853A-94BBAB8AA836}.Debug|Any CPU.Build.0 = Debug|Any CPU {1E06949A-F394-4BE8-853A-94BBAB8AA836}.Debug|x64.ActiveCfg = Debug|Any CPU {1E06949A-F394-4BE8-853A-94BBAB8AA836}.Debug|x64.Build.0 = Debug|Any CPU {1E06949A-F394-4BE8-853A-94BBAB8AA836}.Debug|x86.ActiveCfg = Debug|Any CPU {1E06949A-F394-4BE8-853A-94BBAB8AA836}.Debug|x86.Build.0 = Debug|Any CPU {1E06949A-F394-4BE8-853A-94BBAB8AA836}.Release|Any CPU.ActiveCfg = Release|Any CPU {1E06949A-F394-4BE8-853A-94BBAB8AA836}.Release|Any CPU.Build.0 = Release|Any CPU {1E06949A-F394-4BE8-853A-94BBAB8AA836}.Release|x64.ActiveCfg = Release|Any CPU {1E06949A-F394-4BE8-853A-94BBAB8AA836}.Release|x64.Build.0 = Release|Any CPU {1E06949A-F394-4BE8-853A-94BBAB8AA836}.Release|x86.ActiveCfg = Release|Any CPU {1E06949A-F394-4BE8-853A-94BBAB8AA836}.Release|x86.Build.0 = Release|Any CPU {EB51A057-60F6-44C8-AEDD-6591B5DC88A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EB51A057-60F6-44C8-AEDD-6591B5DC88A8}.Debug|Any CPU.Build.0 = Debug|Any CPU {EB51A057-60F6-44C8-AEDD-6591B5DC88A8}.Debug|x64.ActiveCfg = Debug|Any CPU {EB51A057-60F6-44C8-AEDD-6591B5DC88A8}.Debug|x64.Build.0 = Debug|Any CPU {EB51A057-60F6-44C8-AEDD-6591B5DC88A8}.Debug|x86.ActiveCfg = Debug|Any CPU {EB51A057-60F6-44C8-AEDD-6591B5DC88A8}.Debug|x86.Build.0 = Debug|Any CPU {EB51A057-60F6-44C8-AEDD-6591B5DC88A8}.Release|Any CPU.ActiveCfg = Release|Any CPU {EB51A057-60F6-44C8-AEDD-6591B5DC88A8}.Release|Any CPU.Build.0 = Release|Any CPU {EB51A057-60F6-44C8-AEDD-6591B5DC88A8}.Release|x64.ActiveCfg = Release|Any CPU {EB51A057-60F6-44C8-AEDD-6591B5DC88A8}.Release|x64.Build.0 = Release|Any CPU {EB51A057-60F6-44C8-AEDD-6591B5DC88A8}.Release|x86.ActiveCfg = Release|Any CPU {EB51A057-60F6-44C8-AEDD-6591B5DC88A8}.Release|x86.Build.0 = Release|Any CPU {DAB14A91-2EB1-493C-A5B9-E846E1299938}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DAB14A91-2EB1-493C-A5B9-E846E1299938}.Debug|Any CPU.Build.0 = Debug|Any CPU {DAB14A91-2EB1-493C-A5B9-E846E1299938}.Debug|x64.ActiveCfg = Debug|Any CPU {DAB14A91-2EB1-493C-A5B9-E846E1299938}.Debug|x64.Build.0 = Debug|Any CPU {DAB14A91-2EB1-493C-A5B9-E846E1299938}.Debug|x86.ActiveCfg = Debug|Any CPU {DAB14A91-2EB1-493C-A5B9-E846E1299938}.Debug|x86.Build.0 = Debug|Any CPU {DAB14A91-2EB1-493C-A5B9-E846E1299938}.Release|Any CPU.ActiveCfg = Release|Any CPU {DAB14A91-2EB1-493C-A5B9-E846E1299938}.Release|Any CPU.Build.0 = Release|Any CPU {DAB14A91-2EB1-493C-A5B9-E846E1299938}.Release|x64.ActiveCfg = Release|Any CPU {DAB14A91-2EB1-493C-A5B9-E846E1299938}.Release|x64.Build.0 = Release|Any CPU {DAB14A91-2EB1-493C-A5B9-E846E1299938}.Release|x86.ActiveCfg = Release|Any CPU {DAB14A91-2EB1-493C-A5B9-E846E1299938}.Release|x86.Build.0 = Release|Any CPU {F937FF67-EC5A-4F85-8DFC-843EF96FAE16}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F937FF67-EC5A-4F85-8DFC-843EF96FAE16}.Debug|Any CPU.Build.0 = Debug|Any CPU {F937FF67-EC5A-4F85-8DFC-843EF96FAE16}.Debug|x64.ActiveCfg = Debug|Any CPU {F937FF67-EC5A-4F85-8DFC-843EF96FAE16}.Debug|x64.Build.0 = Debug|Any CPU {F937FF67-EC5A-4F85-8DFC-843EF96FAE16}.Debug|x86.ActiveCfg = Debug|Any CPU {F937FF67-EC5A-4F85-8DFC-843EF96FAE16}.Debug|x86.Build.0 = Debug|Any CPU {F937FF67-EC5A-4F85-8DFC-843EF96FAE16}.Release|Any CPU.ActiveCfg = Release|Any CPU {F937FF67-EC5A-4F85-8DFC-843EF96FAE16}.Release|Any CPU.Build.0 = Release|Any CPU {F937FF67-EC5A-4F85-8DFC-843EF96FAE16}.Release|x64.ActiveCfg = Release|Any CPU {F937FF67-EC5A-4F85-8DFC-843EF96FAE16}.Release|x64.Build.0 = Release|Any CPU {F937FF67-EC5A-4F85-8DFC-843EF96FAE16}.Release|x86.ActiveCfg = Release|Any CPU {F937FF67-EC5A-4F85-8DFC-843EF96FAE16}.Release|x86.Build.0 = Release|Any CPU {B78D2711-96CB-4FA9-BB46-2B61142FA7C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B78D2711-96CB-4FA9-BB46-2B61142FA7C4}.Debug|Any CPU.Build.0 = Debug|Any CPU {B78D2711-96CB-4FA9-BB46-2B61142FA7C4}.Debug|x64.ActiveCfg = Debug|Any CPU {B78D2711-96CB-4FA9-BB46-2B61142FA7C4}.Debug|x64.Build.0 = Debug|Any CPU {B78D2711-96CB-4FA9-BB46-2B61142FA7C4}.Debug|x86.ActiveCfg = Debug|Any CPU {B78D2711-96CB-4FA9-BB46-2B61142FA7C4}.Debug|x86.Build.0 = Debug|Any CPU {B78D2711-96CB-4FA9-BB46-2B61142FA7C4}.Release|Any CPU.ActiveCfg = Release|Any CPU {B78D2711-96CB-4FA9-BB46-2B61142FA7C4}.Release|Any CPU.Build.0 = Release|Any CPU {B78D2711-96CB-4FA9-BB46-2B61142FA7C4}.Release|x64.ActiveCfg = Release|Any CPU {B78D2711-96CB-4FA9-BB46-2B61142FA7C4}.Release|x64.Build.0 = Release|Any CPU {B78D2711-96CB-4FA9-BB46-2B61142FA7C4}.Release|x86.ActiveCfg = Release|Any CPU {B78D2711-96CB-4FA9-BB46-2B61142FA7C4}.Release|x86.Build.0 = Release|Any CPU {33541ADA-A350-4C7E-AA45-BA1565A885E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {33541ADA-A350-4C7E-AA45-BA1565A885E1}.Debug|Any CPU.Build.0 = Debug|Any CPU {33541ADA-A350-4C7E-AA45-BA1565A885E1}.Debug|x64.ActiveCfg = Debug|Any CPU {33541ADA-A350-4C7E-AA45-BA1565A885E1}.Debug|x64.Build.0 = Debug|Any CPU {33541ADA-A350-4C7E-AA45-BA1565A885E1}.Debug|x86.ActiveCfg = Debug|Any CPU {33541ADA-A350-4C7E-AA45-BA1565A885E1}.Debug|x86.Build.0 = Debug|Any CPU {33541ADA-A350-4C7E-AA45-BA1565A885E1}.Release|Any CPU.ActiveCfg = Release|Any CPU {33541ADA-A350-4C7E-AA45-BA1565A885E1}.Release|Any CPU.Build.0 = Release|Any CPU {33541ADA-A350-4C7E-AA45-BA1565A885E1}.Release|x64.ActiveCfg = Release|Any CPU {33541ADA-A350-4C7E-AA45-BA1565A885E1}.Release|x64.Build.0 = Release|Any CPU {33541ADA-A350-4C7E-AA45-BA1565A885E1}.Release|x86.ActiveCfg = Release|Any CPU {33541ADA-A350-4C7E-AA45-BA1565A885E1}.Release|x86.Build.0 = Release|Any CPU {7236CBC9-6395-4D97-A934-98798CCD5F27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7236CBC9-6395-4D97-A934-98798CCD5F27}.Debug|Any CPU.Build.0 = Debug|Any CPU {7236CBC9-6395-4D97-A934-98798CCD5F27}.Debug|x64.ActiveCfg = Debug|Any CPU {7236CBC9-6395-4D97-A934-98798CCD5F27}.Debug|x64.Build.0 = Debug|Any CPU {7236CBC9-6395-4D97-A934-98798CCD5F27}.Debug|x86.ActiveCfg = Debug|Any CPU {7236CBC9-6395-4D97-A934-98798CCD5F27}.Debug|x86.Build.0 = Debug|Any CPU {7236CBC9-6395-4D97-A934-98798CCD5F27}.Release|Any CPU.ActiveCfg = Release|Any CPU {7236CBC9-6395-4D97-A934-98798CCD5F27}.Release|Any CPU.Build.0 = Release|Any CPU {7236CBC9-6395-4D97-A934-98798CCD5F27}.Release|x64.ActiveCfg = Release|Any CPU {7236CBC9-6395-4D97-A934-98798CCD5F27}.Release|x64.Build.0 = Release|Any CPU {7236CBC9-6395-4D97-A934-98798CCD5F27}.Release|x86.ActiveCfg = Release|Any CPU {7236CBC9-6395-4D97-A934-98798CCD5F27}.Release|x86.Build.0 = Release|Any CPU {D5D09AA6-99FE-43B3-9EEE-44E5DDBB8EEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D5D09AA6-99FE-43B3-9EEE-44E5DDBB8EEC}.Debug|Any CPU.Build.0 = Debug|Any CPU {D5D09AA6-99FE-43B3-9EEE-44E5DDBB8EEC}.Debug|x64.ActiveCfg = Debug|Any CPU {D5D09AA6-99FE-43B3-9EEE-44E5DDBB8EEC}.Debug|x64.Build.0 = Debug|Any CPU {D5D09AA6-99FE-43B3-9EEE-44E5DDBB8EEC}.Debug|x86.ActiveCfg = Debug|Any CPU {D5D09AA6-99FE-43B3-9EEE-44E5DDBB8EEC}.Debug|x86.Build.0 = Debug|Any CPU {D5D09AA6-99FE-43B3-9EEE-44E5DDBB8EEC}.Release|Any CPU.ActiveCfg = Release|Any CPU {D5D09AA6-99FE-43B3-9EEE-44E5DDBB8EEC}.Release|Any CPU.Build.0 = Release|Any CPU {D5D09AA6-99FE-43B3-9EEE-44E5DDBB8EEC}.Release|x64.ActiveCfg = Release|Any CPU {D5D09AA6-99FE-43B3-9EEE-44E5DDBB8EEC}.Release|x64.Build.0 = Release|Any CPU {D5D09AA6-99FE-43B3-9EEE-44E5DDBB8EEC}.Release|x86.ActiveCfg = Release|Any CPU {D5D09AA6-99FE-43B3-9EEE-44E5DDBB8EEC}.Release|x86.Build.0 = Release|Any CPU {4E3E8CFD-6DB9-4D95-845D-1E955796C061}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4E3E8CFD-6DB9-4D95-845D-1E955796C061}.Debug|Any CPU.Build.0 = Debug|Any CPU {4E3E8CFD-6DB9-4D95-845D-1E955796C061}.Debug|x64.ActiveCfg = Debug|Any CPU {4E3E8CFD-6DB9-4D95-845D-1E955796C061}.Debug|x64.Build.0 = Debug|Any CPU {4E3E8CFD-6DB9-4D95-845D-1E955796C061}.Debug|x86.ActiveCfg = Debug|Any CPU {4E3E8CFD-6DB9-4D95-845D-1E955796C061}.Debug|x86.Build.0 = Debug|Any CPU {4E3E8CFD-6DB9-4D95-845D-1E955796C061}.Release|Any CPU.ActiveCfg = Release|Any CPU {4E3E8CFD-6DB9-4D95-845D-1E955796C061}.Release|Any CPU.Build.0 = Release|Any CPU {4E3E8CFD-6DB9-4D95-845D-1E955796C061}.Release|x64.ActiveCfg = Release|Any CPU {4E3E8CFD-6DB9-4D95-845D-1E955796C061}.Release|x64.Build.0 = Release|Any CPU {4E3E8CFD-6DB9-4D95-845D-1E955796C061}.Release|x86.ActiveCfg = Release|Any CPU {4E3E8CFD-6DB9-4D95-845D-1E955796C061}.Release|x86.Build.0 = Release|Any CPU {83481B0E-62A6-4427-B645-FCE090A3F8C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {83481B0E-62A6-4427-B645-FCE090A3F8C3}.Debug|Any CPU.Build.0 = Debug|Any CPU {83481B0E-62A6-4427-B645-FCE090A3F8C3}.Debug|x64.ActiveCfg = Debug|Any CPU {83481B0E-62A6-4427-B645-FCE090A3F8C3}.Debug|x64.Build.0 = Debug|Any CPU {83481B0E-62A6-4427-B645-FCE090A3F8C3}.Debug|x86.ActiveCfg = Debug|Any CPU {83481B0E-62A6-4427-B645-FCE090A3F8C3}.Debug|x86.Build.0 = Debug|Any CPU {83481B0E-62A6-4427-B645-FCE090A3F8C3}.Release|Any CPU.ActiveCfg = Release|Any CPU {83481B0E-62A6-4427-B645-FCE090A3F8C3}.Release|Any CPU.Build.0 = Release|Any CPU {83481B0E-62A6-4427-B645-FCE090A3F8C3}.Release|x64.ActiveCfg = Release|Any CPU {83481B0E-62A6-4427-B645-FCE090A3F8C3}.Release|x64.Build.0 = Release|Any CPU {83481B0E-62A6-4427-B645-FCE090A3F8C3}.Release|x86.ActiveCfg = Release|Any CPU {83481B0E-62A6-4427-B645-FCE090A3F8C3}.Release|x86.Build.0 = Release|Any CPU {183C51EE-B17B-4607-991B-16A01FE5A66E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {183C51EE-B17B-4607-991B-16A01FE5A66E}.Debug|Any CPU.Build.0 = Debug|Any CPU {183C51EE-B17B-4607-991B-16A01FE5A66E}.Debug|x64.ActiveCfg = Debug|Any CPU {183C51EE-B17B-4607-991B-16A01FE5A66E}.Debug|x64.Build.0 = Debug|Any CPU {183C51EE-B17B-4607-991B-16A01FE5A66E}.Debug|x86.ActiveCfg = Debug|Any CPU {183C51EE-B17B-4607-991B-16A01FE5A66E}.Debug|x86.Build.0 = Debug|Any CPU {183C51EE-B17B-4607-991B-16A01FE5A66E}.Release|Any CPU.ActiveCfg = Release|Any CPU {183C51EE-B17B-4607-991B-16A01FE5A66E}.Release|Any CPU.Build.0 = Release|Any CPU {183C51EE-B17B-4607-991B-16A01FE5A66E}.Release|x64.ActiveCfg = Release|Any CPU {183C51EE-B17B-4607-991B-16A01FE5A66E}.Release|x64.Build.0 = Release|Any CPU {183C51EE-B17B-4607-991B-16A01FE5A66E}.Release|x86.ActiveCfg = Release|Any CPU {183C51EE-B17B-4607-991B-16A01FE5A66E}.Release|x86.Build.0 = Release|Any CPU {C1933686-B6BC-49A4-87FA-69AAB0C1500B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C1933686-B6BC-49A4-87FA-69AAB0C1500B}.Debug|Any CPU.Build.0 = Debug|Any CPU {C1933686-B6BC-49A4-87FA-69AAB0C1500B}.Debug|x64.ActiveCfg = Debug|Any CPU {C1933686-B6BC-49A4-87FA-69AAB0C1500B}.Debug|x64.Build.0 = Debug|Any CPU {C1933686-B6BC-49A4-87FA-69AAB0C1500B}.Debug|x86.ActiveCfg = Debug|Any CPU {C1933686-B6BC-49A4-87FA-69AAB0C1500B}.Debug|x86.Build.0 = Debug|Any CPU {C1933686-B6BC-49A4-87FA-69AAB0C1500B}.Release|Any CPU.ActiveCfg = Release|Any CPU {C1933686-B6BC-49A4-87FA-69AAB0C1500B}.Release|Any CPU.Build.0 = Release|Any CPU {C1933686-B6BC-49A4-87FA-69AAB0C1500B}.Release|x64.ActiveCfg = Release|Any CPU {C1933686-B6BC-49A4-87FA-69AAB0C1500B}.Release|x64.Build.0 = Release|Any CPU {C1933686-B6BC-49A4-87FA-69AAB0C1500B}.Release|x86.ActiveCfg = Release|Any CPU {C1933686-B6BC-49A4-87FA-69AAB0C1500B}.Release|x86.Build.0 = Release|Any CPU {B63BA635-EA21-4D00-B7C1-2104FCDD169D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B63BA635-EA21-4D00-B7C1-2104FCDD169D}.Debug|Any CPU.Build.0 = Debug|Any CPU {B63BA635-EA21-4D00-B7C1-2104FCDD169D}.Debug|x64.ActiveCfg = Debug|Any CPU {B63BA635-EA21-4D00-B7C1-2104FCDD169D}.Debug|x64.Build.0 = Debug|Any CPU {B63BA635-EA21-4D00-B7C1-2104FCDD169D}.Debug|x86.ActiveCfg = Debug|Any CPU {B63BA635-EA21-4D00-B7C1-2104FCDD169D}.Debug|x86.Build.0 = Debug|Any CPU {B63BA635-EA21-4D00-B7C1-2104FCDD169D}.Release|Any CPU.ActiveCfg = Release|Any CPU {B63BA635-EA21-4D00-B7C1-2104FCDD169D}.Release|Any CPU.Build.0 = Release|Any CPU {B63BA635-EA21-4D00-B7C1-2104FCDD169D}.Release|x64.ActiveCfg = Release|Any CPU {B63BA635-EA21-4D00-B7C1-2104FCDD169D}.Release|x64.Build.0 = Release|Any CPU {B63BA635-EA21-4D00-B7C1-2104FCDD169D}.Release|x86.ActiveCfg = Release|Any CPU {B63BA635-EA21-4D00-B7C1-2104FCDD169D}.Release|x86.Build.0 = Release|Any CPU {AB9184CF-DAE4-4F7A-BF14-7E7140C2DD57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AB9184CF-DAE4-4F7A-BF14-7E7140C2DD57}.Debug|Any CPU.Build.0 = Debug|Any CPU {AB9184CF-DAE4-4F7A-BF14-7E7140C2DD57}.Debug|x64.ActiveCfg = Debug|Any CPU {AB9184CF-DAE4-4F7A-BF14-7E7140C2DD57}.Debug|x64.Build.0 = Debug|Any CPU {AB9184CF-DAE4-4F7A-BF14-7E7140C2DD57}.Debug|x86.ActiveCfg = Debug|Any CPU {AB9184CF-DAE4-4F7A-BF14-7E7140C2DD57}.Debug|x86.Build.0 = Debug|Any CPU {AB9184CF-DAE4-4F7A-BF14-7E7140C2DD57}.Release|Any CPU.ActiveCfg = Release|Any CPU {AB9184CF-DAE4-4F7A-BF14-7E7140C2DD57}.Release|Any CPU.Build.0 = Release|Any CPU {AB9184CF-DAE4-4F7A-BF14-7E7140C2DD57}.Release|x64.ActiveCfg = Release|Any CPU {AB9184CF-DAE4-4F7A-BF14-7E7140C2DD57}.Release|x64.Build.0 = Release|Any CPU {AB9184CF-DAE4-4F7A-BF14-7E7140C2DD57}.Release|x86.ActiveCfg = Release|Any CPU {AB9184CF-DAE4-4F7A-BF14-7E7140C2DD57}.Release|x86.Build.0 = Release|Any CPU {99FD4D50-6E34-4C43-9730-DAB97F81ED8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {99FD4D50-6E34-4C43-9730-DAB97F81ED8B}.Debug|Any CPU.Build.0 = Debug|Any CPU {99FD4D50-6E34-4C43-9730-DAB97F81ED8B}.Debug|x64.ActiveCfg = Debug|Any CPU {99FD4D50-6E34-4C43-9730-DAB97F81ED8B}.Debug|x64.Build.0 = Debug|Any CPU {99FD4D50-6E34-4C43-9730-DAB97F81ED8B}.Debug|x86.ActiveCfg = Debug|Any CPU {99FD4D50-6E34-4C43-9730-DAB97F81ED8B}.Debug|x86.Build.0 = Debug|Any CPU {99FD4D50-6E34-4C43-9730-DAB97F81ED8B}.Release|Any CPU.ActiveCfg = Release|Any CPU {99FD4D50-6E34-4C43-9730-DAB97F81ED8B}.Release|Any CPU.Build.0 = Release|Any CPU {99FD4D50-6E34-4C43-9730-DAB97F81ED8B}.Release|x64.ActiveCfg = Release|Any CPU {99FD4D50-6E34-4C43-9730-DAB97F81ED8B}.Release|x64.Build.0 = Release|Any CPU {99FD4D50-6E34-4C43-9730-DAB97F81ED8B}.Release|x86.ActiveCfg = Release|Any CPU {99FD4D50-6E34-4C43-9730-DAB97F81ED8B}.Release|x86.Build.0 = Release|Any CPU {134218F9-5B38-4E19-A74D-F05A3F179B53}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {134218F9-5B38-4E19-A74D-F05A3F179B53}.Debug|Any CPU.Build.0 = Debug|Any CPU {134218F9-5B38-4E19-A74D-F05A3F179B53}.Debug|x64.ActiveCfg = Debug|Any CPU {134218F9-5B38-4E19-A74D-F05A3F179B53}.Debug|x64.Build.0 = Debug|Any CPU {134218F9-5B38-4E19-A74D-F05A3F179B53}.Debug|x86.ActiveCfg = Debug|Any CPU {134218F9-5B38-4E19-A74D-F05A3F179B53}.Debug|x86.Build.0 = Debug|Any CPU {134218F9-5B38-4E19-A74D-F05A3F179B53}.Release|Any CPU.ActiveCfg = Release|Any CPU {134218F9-5B38-4E19-A74D-F05A3F179B53}.Release|Any CPU.Build.0 = Release|Any CPU {134218F9-5B38-4E19-A74D-F05A3F179B53}.Release|x64.ActiveCfg = Release|Any CPU {134218F9-5B38-4E19-A74D-F05A3F179B53}.Release|x64.Build.0 = Release|Any CPU {134218F9-5B38-4E19-A74D-F05A3F179B53}.Release|x86.ActiveCfg = Release|Any CPU {134218F9-5B38-4E19-A74D-F05A3F179B53}.Release|x86.Build.0 = Release|Any CPU {6F24F522-37B0-422E-93F2-F9617C253987}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6F24F522-37B0-422E-93F2-F9617C253987}.Debug|Any CPU.Build.0 = Debug|Any CPU {6F24F522-37B0-422E-93F2-F9617C253987}.Debug|x64.ActiveCfg = Debug|Any CPU {6F24F522-37B0-422E-93F2-F9617C253987}.Debug|x64.Build.0 = Debug|Any CPU {6F24F522-37B0-422E-93F2-F9617C253987}.Debug|x86.ActiveCfg = Debug|Any CPU {6F24F522-37B0-422E-93F2-F9617C253987}.Debug|x86.Build.0 = Debug|Any CPU {6F24F522-37B0-422E-93F2-F9617C253987}.Release|Any CPU.ActiveCfg = Release|Any CPU {6F24F522-37B0-422E-93F2-F9617C253987}.Release|Any CPU.Build.0 = Release|Any CPU {6F24F522-37B0-422E-93F2-F9617C253987}.Release|x64.ActiveCfg = Release|Any CPU {6F24F522-37B0-422E-93F2-F9617C253987}.Release|x64.Build.0 = Release|Any CPU {6F24F522-37B0-422E-93F2-F9617C253987}.Release|x86.ActiveCfg = Release|Any CPU {6F24F522-37B0-422E-93F2-F9617C253987}.Release|x86.Build.0 = Release|Any CPU {575D7157-6997-4BDA-840A-D272EEDBACBD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {575D7157-6997-4BDA-840A-D272EEDBACBD}.Debug|Any CPU.Build.0 = Debug|Any CPU {575D7157-6997-4BDA-840A-D272EEDBACBD}.Debug|x64.ActiveCfg = Debug|Any CPU {575D7157-6997-4BDA-840A-D272EEDBACBD}.Debug|x64.Build.0 = Debug|Any CPU {575D7157-6997-4BDA-840A-D272EEDBACBD}.Debug|x86.ActiveCfg = Debug|Any CPU {575D7157-6997-4BDA-840A-D272EEDBACBD}.Debug|x86.Build.0 = Debug|Any CPU {575D7157-6997-4BDA-840A-D272EEDBACBD}.Release|Any CPU.ActiveCfg = Release|Any CPU {575D7157-6997-4BDA-840A-D272EEDBACBD}.Release|Any CPU.Build.0 = Release|Any CPU {575D7157-6997-4BDA-840A-D272EEDBACBD}.Release|x64.ActiveCfg = Release|Any CPU {575D7157-6997-4BDA-840A-D272EEDBACBD}.Release|x64.Build.0 = Release|Any CPU {575D7157-6997-4BDA-840A-D272EEDBACBD}.Release|x86.ActiveCfg = Release|Any CPU {575D7157-6997-4BDA-840A-D272EEDBACBD}.Release|x86.Build.0 = Release|Any CPU {44CB7746-43BB-47FD-B2B9-D0CD2E15E2AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {44CB7746-43BB-47FD-B2B9-D0CD2E15E2AA}.Debug|Any CPU.Build.0 = Debug|Any CPU {44CB7746-43BB-47FD-B2B9-D0CD2E15E2AA}.Debug|x64.ActiveCfg = Debug|Any CPU {44CB7746-43BB-47FD-B2B9-D0CD2E15E2AA}.Debug|x64.Build.0 = Debug|Any CPU {44CB7746-43BB-47FD-B2B9-D0CD2E15E2AA}.Debug|x86.ActiveCfg = Debug|Any CPU {44CB7746-43BB-47FD-B2B9-D0CD2E15E2AA}.Debug|x86.Build.0 = Debug|Any CPU {44CB7746-43BB-47FD-B2B9-D0CD2E15E2AA}.Release|Any CPU.ActiveCfg = Release|Any CPU {44CB7746-43BB-47FD-B2B9-D0CD2E15E2AA}.Release|Any CPU.Build.0 = Release|Any CPU {44CB7746-43BB-47FD-B2B9-D0CD2E15E2AA}.Release|x64.ActiveCfg = Release|Any CPU {44CB7746-43BB-47FD-B2B9-D0CD2E15E2AA}.Release|x64.Build.0 = Release|Any CPU {44CB7746-43BB-47FD-B2B9-D0CD2E15E2AA}.Release|x86.ActiveCfg = Release|Any CPU {44CB7746-43BB-47FD-B2B9-D0CD2E15E2AA}.Release|x86.Build.0 = Release|Any CPU {9ED86973-D986-40DD-9068-627FE33D9F5A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9ED86973-D986-40DD-9068-627FE33D9F5A}.Debug|Any CPU.Build.0 = Debug|Any CPU {9ED86973-D986-40DD-9068-627FE33D9F5A}.Debug|x64.ActiveCfg = Debug|Any CPU {9ED86973-D986-40DD-9068-627FE33D9F5A}.Debug|x64.Build.0 = Debug|Any CPU {9ED86973-D986-40DD-9068-627FE33D9F5A}.Debug|x86.ActiveCfg = Debug|Any CPU {9ED86973-D986-40DD-9068-627FE33D9F5A}.Debug|x86.Build.0 = Debug|Any CPU {9ED86973-D986-40DD-9068-627FE33D9F5A}.Release|Any CPU.ActiveCfg = Release|Any CPU {9ED86973-D986-40DD-9068-627FE33D9F5A}.Release|Any CPU.Build.0 = Release|Any CPU {9ED86973-D986-40DD-9068-627FE33D9F5A}.Release|x64.ActiveCfg = Release|Any CPU {9ED86973-D986-40DD-9068-627FE33D9F5A}.Release|x64.Build.0 = Release|Any CPU {9ED86973-D986-40DD-9068-627FE33D9F5A}.Release|x86.ActiveCfg = Release|Any CPU {9ED86973-D986-40DD-9068-627FE33D9F5A}.Release|x86.Build.0 = Release|Any CPU {33BE0F4E-B7DC-45F1-8386-CC79EAD1E185}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {33BE0F4E-B7DC-45F1-8386-CC79EAD1E185}.Debug|Any CPU.Build.0 = Debug|Any CPU {33BE0F4E-B7DC-45F1-8386-CC79EAD1E185}.Debug|x64.ActiveCfg = Debug|Any CPU {33BE0F4E-B7DC-45F1-8386-CC79EAD1E185}.Debug|x64.Build.0 = Debug|Any CPU {33BE0F4E-B7DC-45F1-8386-CC79EAD1E185}.Debug|x86.ActiveCfg = Debug|Any CPU {33BE0F4E-B7DC-45F1-8386-CC79EAD1E185}.Debug|x86.Build.0 = Debug|Any CPU {33BE0F4E-B7DC-45F1-8386-CC79EAD1E185}.Release|Any CPU.ActiveCfg = Release|Any CPU {33BE0F4E-B7DC-45F1-8386-CC79EAD1E185}.Release|Any CPU.Build.0 = Release|Any CPU {33BE0F4E-B7DC-45F1-8386-CC79EAD1E185}.Release|x64.ActiveCfg = Release|Any CPU {33BE0F4E-B7DC-45F1-8386-CC79EAD1E185}.Release|x64.Build.0 = Release|Any CPU {33BE0F4E-B7DC-45F1-8386-CC79EAD1E185}.Release|x86.ActiveCfg = Release|Any CPU {33BE0F4E-B7DC-45F1-8386-CC79EAD1E185}.Release|x86.Build.0 = Release|Any CPU {7C9B9329-6ADC-4BCB-860A-312F727F0DAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7C9B9329-6ADC-4BCB-860A-312F727F0DAD}.Debug|Any CPU.Build.0 = Debug|Any CPU {7C9B9329-6ADC-4BCB-860A-312F727F0DAD}.Debug|x64.ActiveCfg = Debug|Any CPU {7C9B9329-6ADC-4BCB-860A-312F727F0DAD}.Debug|x64.Build.0 = Debug|Any CPU {7C9B9329-6ADC-4BCB-860A-312F727F0DAD}.Debug|x86.ActiveCfg = Debug|Any CPU {7C9B9329-6ADC-4BCB-860A-312F727F0DAD}.Debug|x86.Build.0 = Debug|Any CPU {7C9B9329-6ADC-4BCB-860A-312F727F0DAD}.Release|Any CPU.ActiveCfg = Release|Any CPU {7C9B9329-6ADC-4BCB-860A-312F727F0DAD}.Release|Any CPU.Build.0 = Release|Any CPU {7C9B9329-6ADC-4BCB-860A-312F727F0DAD}.Release|x64.ActiveCfg = Release|Any CPU {7C9B9329-6ADC-4BCB-860A-312F727F0DAD}.Release|x64.Build.0 = Release|Any CPU {7C9B9329-6ADC-4BCB-860A-312F727F0DAD}.Release|x86.ActiveCfg = Release|Any CPU {7C9B9329-6ADC-4BCB-860A-312F727F0DAD}.Release|x86.Build.0 = Release|Any CPU {D83A7939-277A-4AA6-8EFC-1A0ABEAAD638}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D83A7939-277A-4AA6-8EFC-1A0ABEAAD638}.Debug|Any CPU.Build.0 = Debug|Any CPU {D83A7939-277A-4AA6-8EFC-1A0ABEAAD638}.Debug|x64.ActiveCfg = Debug|Any CPU {D83A7939-277A-4AA6-8EFC-1A0ABEAAD638}.Debug|x64.Build.0 = Debug|Any CPU {D83A7939-277A-4AA6-8EFC-1A0ABEAAD638}.Debug|x86.ActiveCfg = Debug|Any CPU {D83A7939-277A-4AA6-8EFC-1A0ABEAAD638}.Debug|x86.Build.0 = Debug|Any CPU {D83A7939-277A-4AA6-8EFC-1A0ABEAAD638}.Release|Any CPU.ActiveCfg = Release|Any CPU {D83A7939-277A-4AA6-8EFC-1A0ABEAAD638}.Release|Any CPU.Build.0 = Release|Any CPU {D83A7939-277A-4AA6-8EFC-1A0ABEAAD638}.Release|x64.ActiveCfg = Release|Any CPU {D83A7939-277A-4AA6-8EFC-1A0ABEAAD638}.Release|x64.Build.0 = Release|Any CPU {D83A7939-277A-4AA6-8EFC-1A0ABEAAD638}.Release|x86.ActiveCfg = Release|Any CPU {D83A7939-277A-4AA6-8EFC-1A0ABEAAD638}.Release|x86.Build.0 = Release|Any CPU {57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}.Debug|Any CPU.Build.0 = Debug|Any CPU {57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}.Debug|x64.ActiveCfg = Debug|Any CPU {57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}.Debug|x64.Build.0 = Debug|Any CPU {57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}.Debug|x86.ActiveCfg = Debug|Any CPU {57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}.Debug|x86.Build.0 = Debug|Any CPU {57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}.Release|Any CPU.ActiveCfg = Release|Any CPU {57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}.Release|Any CPU.Build.0 = Release|Any CPU {57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}.Release|x64.ActiveCfg = Release|Any CPU {57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}.Release|x64.Build.0 = Release|Any CPU {57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}.Release|x86.ActiveCfg = Release|Any CPU {57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}.Release|x86.Build.0 = Release|Any CPU {CFBBEA8F-75B8-4952-AD74-8A5997E374B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CFBBEA8F-75B8-4952-AD74-8A5997E374B9}.Debug|Any CPU.Build.0 = Debug|Any CPU {CFBBEA8F-75B8-4952-AD74-8A5997E374B9}.Debug|x64.ActiveCfg = Debug|Any CPU {CFBBEA8F-75B8-4952-AD74-8A5997E374B9}.Debug|x64.Build.0 = Debug|Any CPU {CFBBEA8F-75B8-4952-AD74-8A5997E374B9}.Debug|x86.ActiveCfg = Debug|Any CPU {CFBBEA8F-75B8-4952-AD74-8A5997E374B9}.Debug|x86.Build.0 = Debug|Any CPU {CFBBEA8F-75B8-4952-AD74-8A5997E374B9}.Release|Any CPU.ActiveCfg = Release|Any CPU {CFBBEA8F-75B8-4952-AD74-8A5997E374B9}.Release|Any CPU.Build.0 = Release|Any CPU {CFBBEA8F-75B8-4952-AD74-8A5997E374B9}.Release|x64.ActiveCfg = Release|Any CPU {CFBBEA8F-75B8-4952-AD74-8A5997E374B9}.Release|x64.Build.0 = Release|Any CPU {CFBBEA8F-75B8-4952-AD74-8A5997E374B9}.Release|x86.ActiveCfg = Release|Any CPU {CFBBEA8F-75B8-4952-AD74-8A5997E374B9}.Release|x86.Build.0 = Release|Any CPU {2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}.Debug|Any CPU.ActiveCfg = Debug|Win32 {2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}.Debug|x64.ActiveCfg = Debug|x64 {2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}.Debug|x64.Build.0 = Debug|x64 {2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}.Debug|x86.ActiveCfg = Debug|Win32 {2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}.Debug|x86.Build.0 = Debug|Win32 {2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}.Release|Any CPU.ActiveCfg = Release|Win32 {2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}.Release|x64.ActiveCfg = Release|x64 {2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}.Release|x64.Build.0 = Release|x64 {2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}.Release|x86.ActiveCfg = Release|Win32 {2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}.Release|x86.Build.0 = Release|Win32 {8522EEF7-9D46-424E-A75B-5F2366228316}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8522EEF7-9D46-424E-A75B-5F2366228316}.Debug|Any CPU.Build.0 = Debug|Any CPU {8522EEF7-9D46-424E-A75B-5F2366228316}.Debug|x64.ActiveCfg = Debug|Any CPU {8522EEF7-9D46-424E-A75B-5F2366228316}.Debug|x64.Build.0 = Debug|Any CPU {8522EEF7-9D46-424E-A75B-5F2366228316}.Debug|x86.ActiveCfg = Debug|Any CPU {8522EEF7-9D46-424E-A75B-5F2366228316}.Debug|x86.Build.0 = Debug|Any CPU {8522EEF7-9D46-424E-A75B-5F2366228316}.Release|Any CPU.ActiveCfg = Release|Any CPU {8522EEF7-9D46-424E-A75B-5F2366228316}.Release|Any CPU.Build.0 = Release|Any CPU {8522EEF7-9D46-424E-A75B-5F2366228316}.Release|x64.ActiveCfg = Release|Any CPU {8522EEF7-9D46-424E-A75B-5F2366228316}.Release|x64.Build.0 = Release|Any CPU {8522EEF7-9D46-424E-A75B-5F2366228316}.Release|x86.ActiveCfg = Release|Any CPU {8522EEF7-9D46-424E-A75B-5F2366228316}.Release|x86.Build.0 = Release|Any CPU {A61313F7-3BEF-4321-B8E3-4E49E71E1502}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A61313F7-3BEF-4321-B8E3-4E49E71E1502}.Debug|Any CPU.Build.0 = Debug|Any CPU {A61313F7-3BEF-4321-B8E3-4E49E71E1502}.Debug|x64.ActiveCfg = Debug|Any CPU {A61313F7-3BEF-4321-B8E3-4E49E71E1502}.Debug|x64.Build.0 = Debug|Any CPU {A61313F7-3BEF-4321-B8E3-4E49E71E1502}.Debug|x86.ActiveCfg = Debug|Any CPU {A61313F7-3BEF-4321-B8E3-4E49E71E1502}.Debug|x86.Build.0 = Debug|Any CPU {A61313F7-3BEF-4321-B8E3-4E49E71E1502}.Release|Any CPU.ActiveCfg = Release|Any CPU {A61313F7-3BEF-4321-B8E3-4E49E71E1502}.Release|Any CPU.Build.0 = Release|Any CPU {A61313F7-3BEF-4321-B8E3-4E49E71E1502}.Release|x64.ActiveCfg = Release|Any CPU {A61313F7-3BEF-4321-B8E3-4E49E71E1502}.Release|x64.Build.0 = Release|Any CPU {A61313F7-3BEF-4321-B8E3-4E49E71E1502}.Release|x86.ActiveCfg = Release|Any CPU {A61313F7-3BEF-4321-B8E3-4E49E71E1502}.Release|x86.Build.0 = Release|Any CPU {3A4328F3-8559-4943-8677-1B31FEE9F739}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3A4328F3-8559-4943-8677-1B31FEE9F739}.Debug|Any CPU.Build.0 = Debug|Any CPU {3A4328F3-8559-4943-8677-1B31FEE9F739}.Debug|x64.ActiveCfg = Debug|Any CPU {3A4328F3-8559-4943-8677-1B31FEE9F739}.Debug|x64.Build.0 = Debug|Any CPU {3A4328F3-8559-4943-8677-1B31FEE9F739}.Debug|x86.ActiveCfg = Debug|Any CPU {3A4328F3-8559-4943-8677-1B31FEE9F739}.Debug|x86.Build.0 = Debug|Any CPU {3A4328F3-8559-4943-8677-1B31FEE9F739}.Release|Any CPU.ActiveCfg = Release|Any CPU {3A4328F3-8559-4943-8677-1B31FEE9F739}.Release|Any CPU.Build.0 = Release|Any CPU {3A4328F3-8559-4943-8677-1B31FEE9F739}.Release|x64.ActiveCfg = Release|Any CPU {3A4328F3-8559-4943-8677-1B31FEE9F739}.Release|x64.Build.0 = Release|Any CPU {3A4328F3-8559-4943-8677-1B31FEE9F739}.Release|x86.ActiveCfg = Release|Any CPU {3A4328F3-8559-4943-8677-1B31FEE9F739}.Release|x86.Build.0 = Release|Any CPU {36830F66-D52D-4294-B393-749FB829342C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {36830F66-D52D-4294-B393-749FB829342C}.Debug|Any CPU.Build.0 = Debug|Any CPU {36830F66-D52D-4294-B393-749FB829342C}.Debug|x64.ActiveCfg = Debug|Any CPU {36830F66-D52D-4294-B393-749FB829342C}.Debug|x64.Build.0 = Debug|Any CPU {36830F66-D52D-4294-B393-749FB829342C}.Debug|x86.ActiveCfg = Debug|Any CPU {36830F66-D52D-4294-B393-749FB829342C}.Debug|x86.Build.0 = Debug|Any CPU {36830F66-D52D-4294-B393-749FB829342C}.Release|Any CPU.ActiveCfg = Release|Any CPU {36830F66-D52D-4294-B393-749FB829342C}.Release|Any CPU.Build.0 = Release|Any CPU {36830F66-D52D-4294-B393-749FB829342C}.Release|x64.ActiveCfg = Release|Any CPU {36830F66-D52D-4294-B393-749FB829342C}.Release|x64.Build.0 = Release|Any CPU {36830F66-D52D-4294-B393-749FB829342C}.Release|x86.ActiveCfg = Release|Any CPU {36830F66-D52D-4294-B393-749FB829342C}.Release|x86.Build.0 = Release|Any CPU {4E377107-E269-4A9A-BD67-DA2F437D20E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4E377107-E269-4A9A-BD67-DA2F437D20E6}.Debug|Any CPU.Build.0 = Debug|Any CPU {4E377107-E269-4A9A-BD67-DA2F437D20E6}.Debug|x64.ActiveCfg = Debug|Any CPU {4E377107-E269-4A9A-BD67-DA2F437D20E6}.Debug|x64.Build.0 = Debug|Any CPU {4E377107-E269-4A9A-BD67-DA2F437D20E6}.Debug|x86.ActiveCfg = Debug|Any CPU {4E377107-E269-4A9A-BD67-DA2F437D20E6}.Debug|x86.Build.0 = Debug|Any CPU {4E377107-E269-4A9A-BD67-DA2F437D20E6}.Release|Any CPU.ActiveCfg = Release|Any CPU {4E377107-E269-4A9A-BD67-DA2F437D20E6}.Release|Any CPU.Build.0 = Release|Any CPU {4E377107-E269-4A9A-BD67-DA2F437D20E6}.Release|x64.ActiveCfg = Release|Any CPU {4E377107-E269-4A9A-BD67-DA2F437D20E6}.Release|x64.Build.0 = Release|Any CPU {4E377107-E269-4A9A-BD67-DA2F437D20E6}.Release|x86.ActiveCfg = Release|Any CPU {4E377107-E269-4A9A-BD67-DA2F437D20E6}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236} = {2ED58793-4F5C-43C8-95B2-ACE56426DF10} {1395B24A-5B30-4312-8D8B-17AD0FF0B64B} = {2ED58793-4F5C-43C8-95B2-ACE56426DF10} {A3E46235-D020-4AEC-918A-F315DA6E9012} = {F1D776AA-9064-489C-92C4-9671FB7761AA} {80197711-36D4-4A93-B75B-3B6DDD4799A7} = {F1D776AA-9064-489C-92C4-9671FB7761AA} {4A20CE71-0214-4289-A730-0D90C5E009B7} = {F1D776AA-9064-489C-92C4-9671FB7761AA} {9851C940-EF7D-414C-89DC-441A3B22B5B5} = {F1D776AA-9064-489C-92C4-9671FB7761AA} {A953159C-7BFB-4BF2-897D-45FE4886C2F1} = {F1D776AA-9064-489C-92C4-9671FB7761AA} {B9F1BFC7-12D7-4434-8335-DDC9E7D0F9D7} = {4E9F5E97-2C87-4A72-B90C-7B6645EA372B} {9DA4DAFA-81CA-47C6-B953-A7D1AD376429} = {4E9F5E97-2C87-4A72-B90C-7B6645EA372B} {6F25470E-E1AB-4254-A8D1-68E6CD40A38B} = {F3EA519B-5D56-4099-94D7-CB390289D130} {B1636BC9-0B5A-4FED-9E19-8CD0957737B3} = {F3EA519B-5D56-4099-94D7-CB390289D130} {4C367220-4A86-4F8F-94A4-E303A882EC38} = {48EB640A-D40F-433F-ACF7-A6360228DE5C} {F9244ECD-9764-466C-8346-BFC5DDB7AAD9} = {48EB640A-D40F-433F-ACF7-A6360228DE5C} {FFB96C42-7EF5-4A9D-9D50-DBBD001D840A} = {48EB640A-D40F-433F-ACF7-A6360228DE5C} {5846FD63-297A-41FE-BDCF-5E1A44418953} = {C53EC418-52D5-4539-8926-EFA66AB51C91} {012FD17A-1F55-4BB6-B923-BEF210AD83B1} = {C53EC418-52D5-4539-8926-EFA66AB51C91} {F324CA0E-2847-4B65-A84B-0350026F563C} = {A1594DA0-6962-4715-B63D-DD8474D529CE} {4D36C405-ACFB-45E1-9F65-A8C1DA4F527C} = {D865F0C6-CEB1-4142-A138-EC0E8A53B23B} {BFFD4218-2CD6-488E-A01F-77B4DA544F20} = {D865F0C6-CEB1-4142-A138-EC0E8A53B23B} {AC426EA1-3118-4A20-BC62-0EAB2F82A17A} = {D865F0C6-CEB1-4142-A138-EC0E8A53B23B} {491A0653-DCF1-43A9-8589-E5422E7C9279} = {D865F0C6-CEB1-4142-A138-EC0E8A53B23B} {168983F2-7C04-43CC-A84D-F815E3BCAF30} = {D865F0C6-CEB1-4142-A138-EC0E8A53B23B} {56B750BA-36B5-453C-A288-4783C48F9FD4} = {168983F2-7C04-43CC-A84D-F815E3BCAF30} {1E06949A-F394-4BE8-853A-94BBAB8AA836} = {168983F2-7C04-43CC-A84D-F815E3BCAF30} {EB51A057-60F6-44C8-AEDD-6591B5DC88A8} = {E8980CC4-17BE-48D9-ADA1-6ADB28E3E076} {DAB14A91-2EB1-493C-A5B9-E846E1299938} = {E8980CC4-17BE-48D9-ADA1-6ADB28E3E076} {F937FF67-EC5A-4F85-8DFC-843EF96FAE16} = {E8980CC4-17BE-48D9-ADA1-6ADB28E3E076} {B78D2711-96CB-4FA9-BB46-2B61142FA7C4} = {E8980CC4-17BE-48D9-ADA1-6ADB28E3E076} {33541ADA-A350-4C7E-AA45-BA1565A885E1} = {E8980CC4-17BE-48D9-ADA1-6ADB28E3E076} {7236CBC9-6395-4D97-A934-98798CCD5F27} = {E8980CC4-17BE-48D9-ADA1-6ADB28E3E076} {D5D09AA6-99FE-43B3-9EEE-44E5DDBB8EEC} = {E8980CC4-17BE-48D9-ADA1-6ADB28E3E076} {4E3E8CFD-6DB9-4D95-845D-1E955796C061} = {E8980CC4-17BE-48D9-ADA1-6ADB28E3E076} {83481B0E-62A6-4427-B645-FCE090A3F8C3} = {E8980CC4-17BE-48D9-ADA1-6ADB28E3E076} {183C51EE-B17B-4607-991B-16A01FE5A66E} = {0B4399BF-B82E-437D-BC87-AD363FEC9B4F} {C1933686-B6BC-49A4-87FA-69AAB0C1500B} = {0B4399BF-B82E-437D-BC87-AD363FEC9B4F} {B63BA635-EA21-4D00-B7C1-2104FCDD169D} = {5D997394-516B-4C50-83F8-49766EE5FD09} {AB9184CF-DAE4-4F7A-BF14-7E7140C2DD57} = {5D997394-516B-4C50-83F8-49766EE5FD09} {99FD4D50-6E34-4C43-9730-DAB97F81ED8B} = {5D997394-516B-4C50-83F8-49766EE5FD09} {134218F9-5B38-4E19-A74D-F05A3F179B53} = {5D997394-516B-4C50-83F8-49766EE5FD09} {6F24F522-37B0-422E-93F2-F9617C253987} = {5D997394-516B-4C50-83F8-49766EE5FD09} {575D7157-6997-4BDA-840A-D272EEDBACBD} = {5D997394-516B-4C50-83F8-49766EE5FD09} {44CB7746-43BB-47FD-B2B9-D0CD2E15E2AA} = {5D997394-516B-4C50-83F8-49766EE5FD09} {9ED86973-D986-40DD-9068-627FE33D9F5A} = {5D997394-516B-4C50-83F8-49766EE5FD09} {33BE0F4E-B7DC-45F1-8386-CC79EAD1E185} = {5D997394-516B-4C50-83F8-49766EE5FD09} {7C9B9329-6ADC-4BCB-860A-312F727F0DAD} = {F3EA519B-5D56-4099-94D7-CB390289D130} {D83A7939-277A-4AA6-8EFC-1A0ABEAAD638} = {F3EA519B-5D56-4099-94D7-CB390289D130} {57D965D9-F3CE-4EFE-857C-AFA7B454D9A1} = {603BF91B-95EB-478E-9CBE-21B85C671BD8} {CFBBEA8F-75B8-4952-AD74-8A5997E374B9} = {F1D776AA-9064-489C-92C4-9671FB7761AA} {2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A} = {BA683E0C-98ED-402B-9141-1B9DAD7B929A} {8522EEF7-9D46-424E-A75B-5F2366228316} = {BA683E0C-98ED-402B-9141-1B9DAD7B929A} {A61313F7-3BEF-4321-B8E3-4E49E71E1502} = {48EB640A-D40F-433F-ACF7-A6360228DE5C} {BA683E0C-98ED-402B-9141-1B9DAD7B929A} = {48EB640A-D40F-433F-ACF7-A6360228DE5C} {3A4328F3-8559-4943-8677-1B31FEE9F739} = {A1594DA0-6962-4715-B63D-DD8474D529CE} {36830F66-D52D-4294-B393-749FB829342C} = {0B4399BF-B82E-437D-BC87-AD363FEC9B4F} {4E377107-E269-4A9A-BD67-DA2F437D20E6} = {5D997394-516B-4C50-83F8-49766EE5FD09} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {E587F394-82FE-4D5C-AF44-4E1B031AAEAC} EndGlobalSection EndGlobal ================================================ FILE: Chapters/Async/Async.sln ================================================  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 VisualStudioVersion = 14.0.25420.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lock", "Lock\Lock.csproj", "{93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TaskLike", "TaskLike\TaskLike.csproj", "{1395B24A-5B30-4312-8D8B-17AD0FF0B64B}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}.Debug|Any CPU.Build.0 = Debug|Any CPU {93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}.Release|Any CPU.ActiveCfg = Release|Any CPU {93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}.Release|Any CPU.Build.0 = Release|Any CPU {1395B24A-5B30-4312-8D8B-17AD0FF0B64B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1395B24A-5B30-4312-8D8B-17AD0FF0B64B}.Debug|Any CPU.Build.0 = Debug|Any CPU {1395B24A-5B30-4312-8D8B-17AD0FF0B64B}.Release|Any CPU.ActiveCfg = Release|Any CPU {1395B24A-5B30-4312-8D8B-17AD0FF0B64B}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal ================================================ FILE: Chapters/Async/Lock/Lock.csproj ================================================  Exe netcoreapp3.0 Lock.Program ================================================ FILE: Chapters/Async/Lock/Monitor.cs ================================================ namespace Lock.Monitor { using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; class Program { static void Main() { const int ThreadNum = 20; const int LoopNum = 20; var num = 0; var syncObject = new object(); Parallel.For(0, ThreadNum, i => { for (int j = 0; j < LoopNum; j++) { bool lockTaken = false; try { Monitor.TryEnter(syncObject, ref lockTaken); // ロック取得 //↓クリティカルセクション int tmp = num; Thread.Sleep(1); num = tmp + 1; //↑クリティカルセクション } finally { if (lockTaken) Monitor.Exit(syncObject); // ロック解放 } } }); Console.WriteLine(num); } } } ================================================ FILE: Chapters/Async/Lock/Program.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Lock { class Program { static void Main(string[] args) { } } } ================================================ FILE: Chapters/Async/TaskLike/Program.cs ================================================ namespace TaskLike { using System; using System.Threading.Tasks; class Program { static async ValueTask XAsync(Random r) { if (r.NextDouble() < 0.99) { // 99% ここを通る。 // この場合、await が1度もなく、非同期処理にならない。 // 非同期処理じゃないのに Task のインスタンスが作られるのはもったいない return 1; } // こちら側は本当に非同期処理なので、Task が必要。 await Task.Delay(100); return 0; } static Task? _cache; // キャッシュしてるものなので、少し時間がたてば、確実に完了済みになる。 static Task CachedX => _cache ?? (_cache = Task.Run(() => 1)); // 完了済みだと非同期処理にならない。 // 非同期処理じゃないのに Task のインスタンスが作られるのはもったいない static async ValueTask Y() => await CachedX; static async ValueTask Z() => await Y(); } } ================================================ FILE: Chapters/Async/TaskLike/TaskLike.cs ================================================ using System; using System.Runtime.CompilerServices; [AsyncMethodBuilder(typeof(AsyncValueTaskMethodBuilder<>))] struct TaskLike { } struct AsyncValueTaskMethodBuilder { public static AsyncValueTaskMethodBuilder Create() => default(AsyncValueTaskMethodBuilder); public void Start(ref TStateMachine stateMachine) where TStateMachine : IAsyncStateMachine { } public void SetStateMachine(IAsyncStateMachine stateMachine) { } public void SetResult(TResult result) { } public void SetException(Exception exception) { } public TaskLike Task { get; } public void AwaitOnCompleted(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : INotifyCompletion where TStateMachine : IAsyncStateMachine { } public void AwaitUnsafeOnCompleted(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : ICriticalNotifyCompletion where TStateMachine : IAsyncStateMachine { } } #if false namespace System.Runtime.CompilerServices { sealed class AsyncMethodBuilderAttribute : Attribute { public AsyncMethodBuilderAttribute(Type builderType) { BuilderType = builderType; } public Type BuilderType { get; } } } #endif ================================================ FILE: Chapters/Async/TaskLike/TaskLike.csproj ================================================  netcoreapp3.0 ================================================ FILE: Chapters/Blogs/UnityAsync/UnityAsync0Introduction.md ================================================ # Unity上でasync/await: はじめに (UnityAsync0Introduction) たまにはAdvent Calendar参加。 このブログは[Unity Advent Calendar 2015](http://qiita.com/advent-calendar/2015/unity)の12月1日の記事です。 7月に書いた「[Unity(ゲームエンジン)上で async/await](http://ufcpp.net/blog/2015/07/unityasyncbridge/)」の続報というか進捗。 あと、補足説明いろいろ。 あれから4か月くらいたったわけでさすがに安定したというか。 むしろ、大して問題出なかったというか。 以下のコミット履歴を見てのとおり、4か月でコミット79個しかないものの、これでもう安定してたりします。 [https://github.com/OrangeCube/MinimumAsyncBridge/commits/master](https://github.com/OrangeCube/MinimumAsyncBridge/commits/master) これが、「最初から安定してるライブラリは不活性に見えて不安がられる」というやつか… むしろ、IL2CPPの安定を待ってるというか… 長くなりそうなので3部構成になっています: - [背景](UnityAsync1Background) - [現状](UnityAsync2CurrentStatus) - [課題と感想](UnityAsync3Retrospective) ================================================ FILE: Chapters/Blogs/UnityAsync/UnityAsync1Background.md ================================================ # Unity上でasync/await: 背景 (UnityAsync1Background) まずasync/awaitについて、 (Unityでない)通常のC#開発の場合がどうとか、 Unityで何が問題で使えなかったかとか、 Rxとの住み分けとかについて書こうかと思います。 ## C# 5.0: async/await の登場 C#界隈で非同期処理がらみの話題がホットになったのはだいたい2010年前後からです。 当時は、 - F# にコンピューテーション式による async ワークフローが登場 - 本家の[Rx](https://rx.codeplex.com/) - これらから少し遅れて、C# 5.0 (async/await)のプレビュー版が登場 という感じです。 最近になって、Rxを参考にした非同期処理ライブラリが、 [Java](https://github.com/ReactiveX/RxJava)や [JavaScript](https://github.com/Reactive-Extensions/RxJS)などで実装されていて注目されていますが、 その一方で、C#ではC# 5.0のasync/awaitが主流になりました。 理由はおおむね、 - async/await はプログラミング言語側のサポートが必要 - async/await が出ることが分かっていたので、それとは違うモデルの Rx の普及にはみな慎重だった という辺りです。逆に言うと、 - C# のバージョンが古いUnityでは、いまだ[Rx](https://github.com/neuecc/UniRx)にかかる期待は大きい - JavaScriptにもES7でasync/awaitが入り、(後述の住み分けはあるものの、それが合う場面では)async/awaitが主流になっていくと思われる ということも言えます。 ## async/awaitとRx 今回、「Unityでもasync/awaitを使えるようにしたよ」という話をするわけですが、 これでRxはお役御免になるかというとそうでもなくて、Rxの用途は残ります。基本的には、 - async/await: pull型で、1つの値を取りに行く場合に有効 - Rx: push型で、ストリームデータを送ってもらう場合に有効 という住み分けになります。 例えば、サーバーからデータを受け取るような場合を想定すると、async/awaitがよさそうな場面は - ログイン時、ユーザーデータを一括で取りたい - ユーザーの行動時、即座に決まる範囲で行動の結果を返してもらいたい Rxがよさそうな場面は - 他のユーザーの行動で、自分が受ける影響をサーバーからpush通知してほしい とかになります。 ![async/awaitが有効な非同期処理](await1.png) ![Rxが有効な非同期処理](await2.png) ## UnityでC# 6.0 Unityの問題は、使っているMonoのバージョンが古いことで、確か2.8系(.NET 3.5/C# 3.0相当、オプション引数とか一部だけC# 4.0機能を先行取り込み)だったはず。 ですが、C#は、古いフレームワーク上でも最新の言語機能を使えたりします。 詳しくは「[C#の言語バージョンと.NET Frameworkバージョン](http://ufcpp.net/study/csharp/cheatsheet/listfxlangversion/)」で書いていますが、 ここで「2.0や3.0で動く」となっている機能は、コンパイラーさえバージョンアップすればUnity上でも使えます。 例えば、C# 6.0の新機能の大半は何もしなくても古いフレームワーク上で動きます。 Caler Info属性や、`FormattedString` は、簡単なクラスの自作で動かせます。 async/await は結構重たいですが、頑張って実装すれば動かせます(これが本稿の主題)。 ### コンパイラーの差し替え C# 6.0コンパイラーを使う方法は大きく分けると2種類あって、 - Unity が使っているコンパイラーを差し替えてしまう(実際にやっている人あり: [Unity C# 5.0 and 6.0 Integration](https://bitbucket.org/alexzzzz/unity-c-5.0-and-6.0-integration/src)) - ロジックの大部分をUnityの外でコンパイルしてしまう となります。 うちは、どのみちロジックの大部分をUnityの外でも使う(データ編集用のデスクトップ アプリや、サーバー上で動かす)ので、 後者のやり方をしています。 ちなみに、C# プロジェクトのVisual Studio上の「ビルド後処理」設定で、 コンパイルしたDLLをUnity Assetsフォルダー以下にコピーするスクリプトを書いて使っています。 - [CopyDllsAfterBuild](https://github.com/ufcpp/UnityTools/tree/master/CopyDllsAfterBuild) ### Unity に async/await 移植 Unity上でasync/awaitを使おうと思うと、[`Task`クラス](https://msdn.microsoft.com/ja-jp/library/system.threading.tasks.task.aspx)の移植が必要になります。 IL2CPP登場以前だと、そもそも`Task`クラスが内部で使っているいくつかのメソッド、 例えば[`Interlocked.CompareExchange`](https://msdn.microsoft.com/ja-jp/library/bb297966.aspx)とかが iOS上(AOTコンパイル)で動かないという問題があって、移植は絶望的でした。 が、IL2CPPが安定してきた今、やってみたら案外あっさり移植できたという状態です。 - [MinimumAsyncBridge](https://github.com/OrangeCube/MinimumAsyncBridge) [導入文](UnityAsync0Introduction)でも書いていますが、あっさり動きすぎて、コミットが少なすぎて非アクティブに見える… まあ、「Minimum」という名前通り、`Task`クラスのうち、async/awaitに必要な部分だけの実装になります。 例えば、`Run`メソッド(別スレッドで処理を開始する)は実装していません。 これに関しては、他の非同期処理ライブラリ(Unityのコルーチンとか、Rxとか)とつないで使う想定です。 ちなみに、Rxに対するつなぎ処理も書いています。 - [UniRx.AsyncBridge](https://github.com/OrangeCube/MinimumAsyncBridge/tree/master/src/UniRx.AsyncBridge) `IObservable`に対するawaiter実装になります。 ## まとめ Unity の制限の多くは、Mono 2.8系のAOTコンパイルの制限に起因するものが多いです。 それが、IL2CPPが安定してきたことによって少し緩和しています。 C# 3.0に留まる理由もなくなっていて、async/awaitのバックポーティングもうまくいっています。 その移植したライブラリが以下のものです。 - [MinimumAsyncBridge](https://github.com/OrangeCube/MinimumAsyncBridge) ================================================ FILE: Chapters/Blogs/UnityAsync/UnityAsync2CurrentStatus.md ================================================ # Unity上でasync/await: 現状 (UnityAsync2CurrentStatus) [MinimumAsyncBridge](https://github.com/OrangeCube/MinimumAsyncBridge)の現状について。 どのくらいまっとうに動いているか。 ちなみに、[7月に書いたとき](http://ufcpp.net/blog/2015/07/unityasyncbridge/)には自分の個人アカウントのリポジトリにコードを置いていましたが、 今は、[会社アカウント]((https://github.com/OrangeCube/)の方に移っています。 ## 実装状況 [背景](UnityAsync1Background)でも説明した通り、`Run`メソッド(別スレッドで処理を開始する)は実装していません。 ここはUnityコルーチンとかRxとつないで使う想定です。 一方で、Minimumと言いつつ、`Delay`、`WhenAll`、`WhenAny`は実装しました。 これで、実プロジェクトに組み込んで使っていますが、ほぼ要件足りています。 async/awaitを使いたい動機が主にサーバーとの通信(I/O非同期)で、スレッド処理(CPU非同期)をあまり必要としていないという背景はありますが。 4か月使ってみて、MinimumAsyncBridge由来の問題に当たって困ったことはほぼないですし、 困ったのはだいたい実装ミスで、現在では修正済みです。 ## IteratorTasksからの移行 うちのプロジェクト、7月までは非同期処理に[IteratorTasks](https://github.com/OrangeCube/IteratorTasks)を使っていました。 IteratorTasksも「`Task`もどき」なので、移行作業、そこまでは苦労しませんでした。必要なのは、 - 名前空間を `IteratorTasks` から `System.Threading.Tasks` に変える - `IEnumerator`、`yield return` を `Task`、`await` に変えて回る を地道にやること。それなりに地道な作業なんですが… バグ修正含めて1・2週間ほど。 もし、IteratorTasksを使っていただけてる方で、この1・2週間ほどの時間は取れないという場合があれば、 IteratorTasksに対するawaiter実装もあるので、これが使えるかも。 - [IteratorTasks.AsyncBridge](https://github.com/OrangeCube/MinimumAsyncBridge/tree/master/src/IteratorTasks.AsyncBridge) ## 本家 Task の完全下位互換 `Run`メソッドみたいに意図して実装していないものをのぞいて、 本家`Task`クラスと互換性があります。 要するに、完全下位互換。 [MinimumAsyncBridge](https://github.com/OrangeCube/MinimumAsyncBridge)を使って動けば、 .NET 4.5以降では本家`Task`を使って100%動きます (逆は、実装していないメソッドを避けないとダメ)。 ちなみに、[型フォワーディング](http://ufcpp.net/study/csharp/package/typeforwarding/?p=3#backporting)という仕組みを使っていて、 - .NET 3.5 (Unity)向けライブラリで[MinimumAsyncBridge](https://github.com/OrangeCube/MinimumAsyncBridge)を使う - .NET 4.5向けライブラリで本家`Task`クラスを使う - これらのライブラリを混在させて、.NET 4.5向けアプリを書く というようなこともできます。.NET 4.5向けアプリから[MinimumAsyncBridge](https://github.com/OrangeCube/MinimumAsyncBridge)を使うと、 本家`Task`クラスに転送されます。 実際、今作っているゲームは.NET 3.5と4.5混在です。 - ちょっとしたデバッグをコンソール アプリで - ボット使った動作テストしたいときにボットをコンソール アプリで - 可視化したいデータがあったときにWPFでGUIをちょろっと - データの編集ツールはWPF製 - (基本、サーバー側は外注なので他社、かつ、PHPなものの)一部、CPU酷使しそうな機能はC#で実装 これらのアプリは全部、Unity上で動かすゲームのロジックを共有しています。 また、現在は、これらは全部.NET 4.6にバージョンアップ済みです。 ### 既知の制限: .NET 4では使えない .NET 3.5と4.5以上では問題なく動きますが、.NET 4では動きません。 おそらくピンポイントに.NET 4が必要になる(.NET 4は使えるけど4.5以上へのアップグレードはできない)場面はほとんどないと思いますが、一応。 これは、.NET 4に、async/awaitはできない中途半端なバージョンの`Task`クラスが存在するため、 型フォワーディングしづらいせいです (新規クラスを足すのは簡単。既存クラスにメソッドを追加するのは無理)。 ### NuGetパッケージ [NuGetパッケージ化](https://www.nuget.org/packages/MinimumAsyncBridge/)してあって、 - .NET 3.5 のプロジェクトからこのNuGe パッケージを参照すると、バックポーティング実装が参照される - .NET 4.5 のプロジェクトからだと、型フォワーディング実装が参照される という挙動をします。とりあえず、NuGet経由で参照するとわずらわしい設定不要で、.NET 3.5と4.5の混在ができます。 ### UniRx向け型フォワーディング 同じような仕組み、[UniRx](https://github.com/neuecc/UniRx)に対しても使えます。つまり、 - Unity向けライブラリではUniRx使う - .NET 4.5向けライブラリでは[本家Rx](https://www.nuget.org/packages/Rx-Main/)を使う - これらのライブラリを混在させて使う とか。とりあえずこの作業やって、Pull Request は出してあったりします。 - [https://github.com/neuecc/UniRx/pull/88](https://github.com/neuecc/UniRx/pull/88) やったことは、 - 名前空間が `UniRx` になっているところを`System.Reactive`に戻す - 意図して本家Rxとは実装変えていた部分を元に戻す(`FirstAsync`→`First`とか) - 別途、型フォワーディング用のライブラリを実装 - 元々のUniRx利用者に影響が出ないように、`#if`分岐 とかです。 ### 既知の制限: C# 6.0 がらみ [MinimumAsyncBridge](https://github.com/OrangeCube/MinimumAsyncBridge)というかIL2CPP側の問題なんですが、 IL2CPPを使う場合(つまり、iOSで実行する場合)、ちょっとだけC# 6.0で使えない構文があります。 現状、以下の構文はIL2CPPでのビルドに失敗、あるいは、iOS実行時に実行時例外を起こします。 async/awaitの問題というか、だいたいは例外処理がらみの問題です。 - catch finally 内での await は使えない - [catch句内での再スロー](http://ufcpp.net/study/csharp/misc_stacktrace.html#rethrow)ができない - [例外フィルター](http://ufcpp.net/study/csharp/oo_exception.html#exception-filter)が使えない ## iOS実行・Android実行 iOSでの実行は、IL2CPPを使えば動きます。 IL2CPPのバグをいくつか踏み抜いて、Unity 5.2.2では動かなくなっていたりしましたが、 Unityへのフィードバックの結果、Unity 5.2.3では直っています。 (Unity 5.2.2の時は、ビルドで失敗していました。 ビルドまで成功したら、実行時エラーが出たことはこれまでどのバージョンでもありませんでした。) ちなみに、Android実行では1度も問題出ていません。 ## 本家Taskクラスらの劣化 `Run`メソッドを実装していないなど、意図的にそうした部分の他に、いくらか残念な部分があります。 - 一部、多少効率悪いはず - 例外のスタックトレース紛失 ### 効率 `TaskCompletionSource`クラスとかawaiterの実装などはほぼベタに本家からの移植なので、そんなに差はないはずです。 問題は`Delay`、`WhenAll`、`WhenAny`の実装。 本家はこの辺りをネイティブ実装していて、 [MinimumAsyncBridge](https://github.com/OrangeCube/MinimumAsyncBridge)では別実装で移植しました。 この辺りは、本家ほど最適な実装はできないんで、さすがに効率ちょっと悪いはず。 - `Delay`: `System.Threading.Timer`で実装 - `WhenAll`/`WhenAny`: 複数の`Task`をリスト管理 - 本家実装だと同時実行するタスク数がむちゃくちゃ多くてもメモリ食わない実装になってるらしいけど、こっちはしっかりタスク数分のメモリを食う。 ### スタックトレース 本家`Task`を使ったasync/awaitの何がすごいって、 スレッド間でスタックトレース情報を伝搬させて、スタックトレースを追えるようにしていることなんですが。 ここはさすがに移植できなかったというか、移植が不可能だったりします。 この機能の実現には.NET 4.5で追加された`System.Runtime.ExceptionServices.ExceptionDispatchInfo.Capture`が必須です。 .NET 3.5向けのバックポーティングはできません。 なので、デバッグは本家`Task`よりも少し大変になります(非同期メソッドの呼び出し元が分からなくなったりする)。 ## まとめ [MinimumAsyncBridge](https://github.com/OrangeCube/MinimumAsyncBridge)、 実装し始めた当初の予想よりもだいぶあっさりと完成。 - .NET 3.5/4.5混在でも使えます - .NET 4では使えません - ほとんど問題起きず、少ない修正で安定してしまいました - iOS(IL2CPP)でも動きます - Unity 5.2.2でIL2CPPのバグで一瞬動かなくなっていたものの、5.2.3で修正されました - 本家`Task`の完全下位互換です - [MinimumAsyncBridge](https://github.com/OrangeCube/MinimumAsyncBridge)で動けば、本家では100%動く - 一部、多少性能的に劣る - スタックトレース紛失で少しデバッグが大変 ================================================ FILE: Chapters/Blogs/UnityAsync/UnityAsync3Retrospective.md ================================================ # Unity上でasync/await: 課題と感想 (UnityAsync3Retrospective) [MinimumAsyncBridge](https://github.com/OrangeCube/MinimumAsyncBridge)化してみてどうかと、 [MinimumAsyncBridge](https://github.com/OrangeCube/MinimumAsyncBridge)を作った感想など。 ## 作業難易度 [参考にした元](http://referencesource.microsoft.com/)があって、書き換えが必要だった部分もごく少量で、 ほとんどコストかからず移植してます。最初から安定しているのも当たり前で。 まあほんとは、もっと昔から.NETがオープンソースだったら…というのはありますが。 IL2CPPで動かなくて困ったりした時期はありますが、この辺りは、別に`Task`クラスのせいじゃなくてそこかしろでバグだらけだったので。 ## 導入した感想 やっぱり普通にC# 5.0のasync/awaitが書けるのはむちゃくちゃ楽です。 自分だけじゃなく、チーム全体で言っても、かなりの作業が浮いてるんじゃないかと。 途中まで[IteratorTasks](https://github.com/OrangeCube/IteratorTasks)を使っていて、 途中で[MinimumAsyncBridge](https://github.com/OrangeCube/MinimumAsyncBridge)に移行するのに1・2週間ほど使いましたが、 その作業分は余裕で取り戻せているのではないかと思います。 何よりも、 - 最新のC#を問題なく使える - 「もどき」じゃなく、標準`Task`の完全下位互換で、完全にコード共通化できる という辺りは非常に大きい。 ## Taskクラスの問題 バックポーティング作業をやっていて感じたのは、`Task`クラスの債務がでかすぎるという問題。 `Task`クラスは、以下のような処理を全部担います。 - スレッド(`Task.Run`) - I/O完了ポート(非同期API) - ハードウェアタイマー(`Task.Delay`) - 他とのつなぎ(`TaskCompletionSource`)、C++でいうfuture/promise 全部1つのクラス。他の言語だと、「他とのつなぎ」だけ用意して、 スレッドとかは別途そいつで軽く包んでるだけなことが多いんですけども。 .NETのTaskは割かし全部入り。 このうち、async/awaitを使うだけなら`TaskCompletionSource`だけあれば何とかなるんですよねぇ。 なのに、そこだけを抜き出して取ってこれない。 おまけでいろいろ、しかもスレッド関連とかいう難しい処理も持ってこないといけない。 例えば以下のような問題があったり。 - `GetAwaiter`が、.NET 4.5で`Task`クラスに追加されてる - 型フォワーディングの仕組みで、クラスの追加はバック ポーティングできるけど、既存クラスへのメソッド追加は無理 - 結果、.NET 3.5と4.5では動くけど、.NET 4では動かないライブラリになってる - 非同期メソッドの戻り値が`Task`固定で、インターフェイスとかになってない - インターフェイスになっていれば、独自実装がしやすい - `Task`クラスみたいにでかいものを移植しなくて済む 全部1つでやってるので性能はいいし、利用者視点の利便性はいいとは思います。 そもそもなぜ非同期処理なんて面倒な事するかというとパフォーマンスを求めてなわけで、 `Task`実装ではパフォーマンスを妥協できなかったというのはあるようです。 あと、async/awaitを変に汎用化しようとすると、 asyncメソッドのオーバーロード解決とかで苦労するらしい(非同期が絡むと型推論が効かなくなったり)。 利便性劣化に直結。 一方で、`Task`を実装する側、 例えば.NET Coreで今絶賛クロスプラットフォーム化作業してる方々とか、 Monoの方々とか、 今回の僕みたいに独自にバック ポーティングすることにした人にとってはこのでかい実装はほんとに面倒。 C#のasync/awaitはそういうでっかい一枚岩の上に乗っかっちゃってるって意味では将来リスクは結構負っています。 この辺りはF#方面の人らは「だからC#はダメだ」とか言ったりするものの。 ここは方向性の違いというか、C#的には「性能と利用者利便性を考えたらTaskに乗るしかなかった」と言われると妥協せざるを得ず。 最近他の言語でもasync/await対応し始めてますけど、それらの言語でも「どこまで汎用化するか」は大きな争点になってるはずです。 まあ、async/awaitに関してはF#もC#も先駆者なので、負の遺産にはなりやすいかもなぁ(F#はパフォーマンス的にペナルティ結構負ってるはずだし、C#は一枚岩の上に載ってるリスクあり)という気はしなくもないです。 もっとも、それを心配しないといけなくなるのはまだまだ5年10年先の話だと思いますが。 ## まとめ 元コードがあるんであっさり動いて当然。 ただ、もっと最初からオープンだったらわざわざ自分が苦労する必要なかったという気もします。 C# 5.0登場時(アイディアが出たのは5・6年前。RTMが2012年)にも言われていたことではあるんですが、 `Task`クラスはちょっと債務がでかすぎるよなぁというのは改めて思いました。 まあ、とりあえず安定して動いたし、その結果、かなり開発が楽になったので実装してよかったと思います。 ================================================ FILE: Chapters/Data/DataTypes.sln ================================================  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.28531.58 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tuples", "Tuples\Tuples.csproj", "{9851C940-EF7D-414C-89DC-441A3B22B5B5}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Deconstruction", "Deconstruction\Deconstruction.csproj", "{A3E46235-D020-4AEC-918A-F315DA6E9012}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OutVar", "OutVar\OutVar.csproj", "{4A20CE71-0214-4289-A730-0D90C5E009B7}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TypeSwitch", "TypeSwitch\TypeSwitch.csproj", "{A953159C-7BFB-4BF2-897D-45FE4886C2F1}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discards", "Discards\Discards.csproj", "{80197711-36D4-4A93-B75B-3B6DDD4799A7}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Patterns", "Patterns\Patterns.csproj", "{8212E7CA-2F62-4D24-92B3-ACA19EFFBD4E}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {9851C940-EF7D-414C-89DC-441A3B22B5B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9851C940-EF7D-414C-89DC-441A3B22B5B5}.Debug|Any CPU.Build.0 = Debug|Any CPU {9851C940-EF7D-414C-89DC-441A3B22B5B5}.Release|Any CPU.ActiveCfg = Release|Any CPU {9851C940-EF7D-414C-89DC-441A3B22B5B5}.Release|Any CPU.Build.0 = Release|Any CPU {A3E46235-D020-4AEC-918A-F315DA6E9012}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A3E46235-D020-4AEC-918A-F315DA6E9012}.Debug|Any CPU.Build.0 = Debug|Any CPU {A3E46235-D020-4AEC-918A-F315DA6E9012}.Release|Any CPU.ActiveCfg = Release|Any CPU {A3E46235-D020-4AEC-918A-F315DA6E9012}.Release|Any CPU.Build.0 = Release|Any CPU {4A20CE71-0214-4289-A730-0D90C5E009B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4A20CE71-0214-4289-A730-0D90C5E009B7}.Debug|Any CPU.Build.0 = Debug|Any CPU {4A20CE71-0214-4289-A730-0D90C5E009B7}.Release|Any CPU.ActiveCfg = Release|Any CPU {4A20CE71-0214-4289-A730-0D90C5E009B7}.Release|Any CPU.Build.0 = Release|Any CPU {A953159C-7BFB-4BF2-897D-45FE4886C2F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A953159C-7BFB-4BF2-897D-45FE4886C2F1}.Debug|Any CPU.Build.0 = Debug|Any CPU {A953159C-7BFB-4BF2-897D-45FE4886C2F1}.Release|Any CPU.ActiveCfg = Release|Any CPU {A953159C-7BFB-4BF2-897D-45FE4886C2F1}.Release|Any CPU.Build.0 = Release|Any CPU {80197711-36D4-4A93-B75B-3B6DDD4799A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {80197711-36D4-4A93-B75B-3B6DDD4799A7}.Debug|Any CPU.Build.0 = Debug|Any CPU {80197711-36D4-4A93-B75B-3B6DDD4799A7}.Release|Any CPU.ActiveCfg = Release|Any CPU {80197711-36D4-4A93-B75B-3B6DDD4799A7}.Release|Any CPU.Build.0 = Release|Any CPU {8212E7CA-2F62-4D24-92B3-ACA19EFFBD4E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8212E7CA-2F62-4D24-92B3-ACA19EFFBD4E}.Debug|Any CPU.Build.0 = Debug|Any CPU {8212E7CA-2F62-4D24-92B3-ACA19EFFBD4E}.Release|Any CPU.ActiveCfg = Release|Any CPU {8212E7CA-2F62-4D24-92B3-ACA19EFFBD4E}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {F6DEAD6E-2EF9-4D4F-847D-D50925152DEB} EndGlobalSection EndGlobal ================================================ FILE: Chapters/Data/Deconstruction/DeconstructMethod.cs ================================================ using System; using System.Collections.Generic; namespace Deconstruction.DeconstructMethod { class Program { static void Main() { var pair = new KeyValuePair("one", 1); var (k, v) = pair; // 以下のようなコードに展開される // string k; // int v; // pair.Deconstruct(out k, out v); var tuple = Tuple.Create("abc", 100); var (x, y) = tuple; // 以下のようなコードに展開される // string x; // int y; // tuple.Deconstruct(out x, out y); } } } ================================================ FILE: Chapters/Data/Deconstruction/Deconstruction.csproj ================================================  Exe netcoreapp3.0 Deconstruction.Program ================================================ FILE: Chapters/Data/Deconstruction/Evaluation.cs ================================================ #pragma warning disable CS0219 using System; namespace Deconstruction.Evaluation { class Program { static void Main() { var t = ("abc", 100); FailureSwap(); TupleSwap(); TupleSwapEval(); SideEffect(); SideEffectEval(); } private static void FailureSwap() { var x = 1; var y = 2; y = x; x = y; // 上の行で y が書き換わっているので、値の入れ替えにはならない Console.WriteLine(x); // 1 Console.WriteLine(y); // 1 // 正しくは以下のように書く // var temp = y; // y = x; // x = temp; } private static void TupleSwap() { var x = 1; var y = 2; // 分解代入であれば、値の書き換えは同時に起こる (y, x) = (x, y); // 一時的にタプルが作られる Console.WriteLine(x); // 2 Console.WriteLine(y); // 1 } private static void TupleSwapEval() { var x = 1; var y = 2; // 実際には、同時に書き換わったように見えるように、一時変数が挟まる // (y, x) = (x, y) であれば、以下のように評価されてる var t = (x, y); y = t.Item1; x = t.Item2; Console.WriteLine(x); // 2 Console.WriteLine(y); // 1 } private static void SideEffect() { var a = new[] { 0, 1, 2, 3 }; var i = 0; (a[i++], a[i++]) = (a[i++], a[i++]); Console.WriteLine(string.Join(", ", a)); // 2, 3, 2, 3 // つまり、以下の評価を受けてる // (a[0], a[1]) = (a[2], a[3]); } private static void SideEffectEval() { var a = new[] { 0, 1, 2, 3 }; var i = 0; ref var l1 = ref a[i++]; ref var l2 = ref a[i++]; var r1 = a[i++]; var r2 = a[i++]; l1 = r1; l2 = r2; Console.WriteLine(string.Join(", ", a)); // 2, 3, 2, 3 } } } ================================================ FILE: Chapters/Data/Deconstruction/Extensions.cs ================================================ using System; using System.Collections.Generic; namespace Deconstruction { static class Extensions { public static void Deconstruct(this KeyValuePair pair, out T key, out U value) { key = pair.Key; value = pair.Value; } public static void Deconstruct(this Tuple x, out T1 item1, out T2 item2) { item1 = x.Item1; item2 = x.Item2; } } } ================================================ FILE: Chapters/Data/Deconstruction/Program.cs ================================================ using System; using System.Collections.Generic; namespace Deconstruction { class Program { static void Main(string[] args) { MeaninglessVariable(); ManuallyDeconstructed(); var items = new[] { 1, 2, 3, 4, 5 }; DeconstractionDeclaration(items); DeconstractionAssingment(items); DeconstractionAssingment(); Conversion(); } private static void Conversion() { // Tally の戻り値は (count, sum) の順 var t = Tally(new[] { 1, 2, 3, 4, 5 }); // sum = t.count, count = t.sum の意味になるので注意が必要 (int sum, int count) = t; Console.WriteLine(sum); // 5 Console.WriteLine(count); // 15 // int → object も int → long も暗黙的に変換可能 // なので、分解もでもこの変換が暗黙的に可能 (object x, long y) = t; } private static void DeconstractionAssingment(int[] items) { { int x, y; // 既存の変数を使って分解 (x, y) = Tally(items); } { var x = 1.0; var y = 5.0; for (int i = 0; i < 3; i++) { (x, y) = ((x + y) / 2, Math.Sqrt(x * y)); } Console.WriteLine($"{x}, {y}"); } } private static void DeconstractionAssingment() { var a = new[] { 1, 2 }; // 配列アクセス var b = new int[a.Length]; (b[1], b[0]) = (a[0], a[1]); // 参照戻り値 var c = new int[a.Length]; (Mod(c, 5), Mod(c, 8)) = (a[0], a[1]); Console.WriteLine(string.Join(", ", b)); Console.WriteLine(string.Join(", ", c)); } static ref T Mod(T[] array, int index) => ref array[index % array.Length]; private static void DeconstractionDeclaration(int[] items) { { // count, sum を宣言しつつ、タプルを分解 (int count, int sum) = Tally(items); // ↓こう書くとタプル型の変数の宣言 // (int count, int sum) t = Tally(items); } { // 型推論で count, sum を宣言しつつ、タプルを分解 (var count, var sum) = Tally(items); // ↓タプルだと var は使えない。これはコンパイル エラー // (var count, var sum) t = Tally(items); } { // 部分的に var を使う (var count, long sum) = Tally(items); } { // var + (変数リスト)でタプルを分解 var (count, sum) = Tally(items); } } private static void ManuallyDeconstructed() { // この3行に相当する構文がほしい var x = Tally(new[] { 1, 2, 3, 4, 5 }); var count = x.count; var sum = x.sum; // 以後、もう x は使わない Console.WriteLine(count); Console.WriteLine(sum); } private static void MeaninglessVariable() { var x = Tally(new[] { 1, 2, 3, 4, 5 }); Console.WriteLine(x.count); Console.WriteLine(x.sum); } static (int count, int sum) Tally(IEnumerable items) { var count = 0; var sum = 0; foreach (var x in items) { sum += x; count++; } return (count, sum); } static void Statements() { (int x, int y)[] array = new[] { (1, 2), (3, 4) }; foreach (var (x, y) in array) { Console.WriteLine($"{x}, {y}"); } for ((int i, int j) = (0, 0); i < 10; i++, j--) { Console.WriteLine($"{i}, {j}"); } // ↓RTM までにはできるようになるはず? //var q = // from (var x, vary) in array // let (sum, product) = (x + y, x * y) // select new { sum, product }; } } } ================================================ FILE: Chapters/Data/Deconstruction/Summary.cs ================================================ namespace Tuples.Deconstruction.Tuples { using System; using System.Collections.Generic; class Program { // タプルを使って2つの戻り値を返す static (int count, int sum) Tally(IEnumerable items) { var count = 0; var sum = 0; foreach (var x in items) { sum += x; count++; } return (count, sum); } static void Main() { var data = new[] { 1, 2, 3, 4, 5 }; var (count, sum) = Tally(data); Console.WriteLine($"{sum}/{count}"); } } } namespace Tuples.Deconstruction.AnyType { using System.Collections.Generic; class Program { static void Main() { var (key, value) = new KeyValuePair("one", 1); } } static class Extensions { public static void Deconstruct(this KeyValuePair pair, out T key, out U value) { key = pair.Key; value = pair.Value; } } } ================================================ FILE: Chapters/Data/Deconstruction/Vector2D.cs ================================================ namespace Deconstruction._Vector2D { using static System.Math; struct Radian { public double Value { get; } public Radian(double value) => Value = value; } struct Vector2D { public double X { get; } public double Y { get; } // コンストラクターは当然、個数が同じでも、型が違えば呼び分けができる public Vector2D(double x, double y) => (X, Y) = (x, y); public Vector2D(double radius, Radian angle) : this(radius * Cos(angle.Value), radius * Sin(angle.Value)) { } // 引数の数が同じ Deconstruct が2つある // 片方だけならいいけど、2つあると分解ができなくなる public void Deconstruct(out double x, out double y) => (x, y) = (X, Y); #if false public void Deconstruct(out double radius, out Radian angle) => (radius, angle) = (Sqrt(X * X + Y * Y), new Radian(Atan2(Y, X))); #endif } class Program { static void Main() { // コンストラクターの呼び分け var p = new Vector2D(1, 2); var q = new Vector2D(10, new Radian(PI / 5)); // 分解は呼び分けできない (double x, double y) = q; // コンパイル エラー #if false (double r, Radian a) = p; // コンパイル エラー #endif } } } ================================================ FILE: Chapters/Data/Deconstruction/Vector3D.cs ================================================ using Deconstruction._Vector2D; namespace Deconstruction._Vector3D { struct Vector3D { public double X { get; } public double Y { get; } public double Z { get; } public Vector3D(double x, double y, double z) => (X, Y, Z) = (x, y, z); // 引数の数が違えば大丈夫 public void Deconstruct(out double x, out double y, out double z) => (x, y, z) = (X, Y, Z); public void Deconstruct(out double first, out Vector2D rest) => (first, rest) = (X, new Vector2D(Y, Z)); } class Program { static void Main() { var p = new Vector3D(1, 2, 3); // 分解可能 var (first, rest) = p; var (x, y, z) = p; } } } ================================================ FILE: Chapters/Data/Discards/Discards.csproj ================================================  Exe netcoreapp3.0 ================================================ FILE: Chapters/Data/Discards/Program.cs ================================================ using System; using System.ComponentModel; class Program { static void Main() { var _ = 10; Console.WriteLine(_); // 10 が表示される } static void Deconstruct0() { // 商と余りを計算するメソッドがあるけども、ここでは商しか要らない // 要らないので適当な変数 x とかで受ける var (q, x) = DivRem(123, 11); // 逆に、余りしか要らない // 要らないから再び適当な変数 x で受けたいけども、x はもう使ってる // しょうがないから x1 とかにしとくか… var (x1, r) = DivRem(123, 11); } static (int quotient, int remainder) DivRem(int dividend, int divisor) => (Math.DivRem(dividend, divisor, out var remainder), remainder); static void Deconstruct() { // 商と余りを計算するメソッドがあるけども、ここでは商しか要らない // _ を書いたところでは、値を受け取らずに無視する var (q, _) = DivRem(123, 11); // 逆に、余りしか要らない // また、本来「var x」とか変数宣言を書くべき場所にも _ だけを書ける (_, var r) = DivRem(123, 11); } static void Deconstruct1() { // _ を書いたところでは、値を受け取らずに無視する var (q, _) = DivRem(123, 11); // _ は変数にはならないので、スコープを汚さない。別の場所でも再び _ を書ける // また、本来「var x」とか変数宣言を書くべき場所にも _ だけを書ける (_, var r) = DivRem(123, 11); } static void Deconstruct2() { // 要らないので適当な変数 x とかで受ける var (q, x) = DivRem(123, 11); // 要らないと言いつつ、参照できてしまう Console.WriteLine(x); // 要らないものは _ で破棄 var (_, r) = DivRem(123, 11); // 分解の中に書いた _ は変数にはならない // 以下の行でコンパイル エラーになる(_ は存在しない) #if false Console.WriteLine(_); #endif } static int TypeSwitch(object obj) { switch (obj) { case int[] x: return x.Length; case long[] x: return 2 * x.Length; // int でさえあれば値は問わない case int _: return 1; // 同、long case long _: return 2; case null: return 0; // 以下の行をコメントアウトするとエラーに // 今のところ、case _ は未実装(将来的に予定はあり) //case _: default: throw new ArgumentOutOfRangeException(); } } // 欲しいのは戻り値だけであって、out 引数で受け取った値は要らない static bool CanParse(string s) => int.TryParse(s, out _); #if false static void Subscribe(INotifyPropertyChanged source) { // 2個目の _ が「同じ名前被ってる」エラーになる source.PropertyChanged += (_, _) => Console.WriteLine("property changed"); } static void Subscribe(INotifyPropertyChanged source) { // (予定)C# 8? // 1回も _ を使わなかったら破棄扱い source.PropertyChanged += (_, _) => { }; // _ を使っているのでこれは引数扱い。同名の別引数は作れない source.PropertyChanged += (_, _1) => Console.WriteLine(_); } #endif } ================================================ FILE: Chapters/Data/OutVar/OutVar.csproj ================================================  Exe netcoreapp3.0 OutVar.Program ================================================ FILE: Chapters/Data/OutVar/Point.cs ================================================ namespace OutVar.Point { using System; struct Point { public int X { get; set; } public int Y { get; set; } public void GetCoordinate(out int x, out int y) { x = X; y = Y; } } class Program { static void Main() { // x, y のスコープはこのブロック内 // この辺りで x, y という名前の変数は作れない var p = new Point { X = 1, Y = 2 }; p.GetCoordinate(out var x, out var y); // 以下のような書き方をしたのと同じ // int x, y; // p.GetCoordinate(out x, out y); // この行から下で x, y を使える Console.WriteLine($"{x}, {y}"); } } } ================================================ FILE: Chapters/Data/OutVar/Program.cs ================================================ namespace OutVar { class Program { static void Main(string[] args) { } class csharp6 { static int? ParseOrDefault(string s) { int x; return int.TryParse(s, out x) ? x : default(int?); } } class csharp7int { static int? ParseOrDefault(string s) { return int.TryParse(s, out int x) ? x : default(int?); } } class csharp7var { static int? ParseOrDefault(string s) { return int.TryParse(s, out var x) ? x : default(int?); } } class csharp7expression { static int? ParseOrDefault(string s) => int.TryParse(s, out var x) ? x : default(int?); } } } ================================================ FILE: Chapters/Data/Patterns/CallOnce.cs ================================================ using System; using System.Collections.Generic; using System.Text; namespace Patterns.CallOnce { class X { public int Value { get; } public X(int value) => Value = value; public void Deconstruct(out int value) => value = Value; } class Program { static int M(X x) => x switch { // 引数の数が同じ位置パターンを3回。 // この場合、Deconstruct(out int) の呼び出しは1回にまとめられる。 (0) _ => 1, (1) _ => 2, (2) _ => 0, _ => x.Value }; } } ================================================ FILE: Chapters/Data/Patterns/ConstantPattern.cs ================================================ using System; using System.Collections.Generic; using System.Text; namespace Patterns.ConstantPattern { class Program { static void Main() { } static int M(object x) { switch (x) { // 定数パターン case 0: return 0; // 型パターン case string s: return s.Length; default: return -1; } } static int M(object x, int comparand) { switch (x) { // case comparand: とは書けない。 // 型パターン + when 句を使う。 case int i when i == comparand: return 0; default: return -1; } } } } ================================================ FILE: Chapters/Data/Patterns/DeconstructRemoval.cs ================================================ namespace Patterns.DeconstructRemoval { using System; class X { // Deconstruct に副作用を持たせる public void Deconstruct() => Console.WriteLine("Deconstruct()"); public void Deconstruct(out int a) { Console.WriteLine("Deconstruct(out int a)"); a = 0; } public void Deconstruct(out int a, out int b) { Console.WriteLine("Deconstruct(out int a, out int b)"); (a, b) = (0, 0); } } class Program { static void Main() { var x = new X(); // Deconstruct() がないとコンパイル エラーになるけど、 // Deconstruct() は呼ばれない。 Console.WriteLine(x is ()); // Deconstruct(out int) がないとコンパイル エラーになるけど、 // Deconstruct(out int) は呼ばれない。 Console.WriteLine(x is var (_)); // Deconstruct(out int, out int) がないとコンパイル エラーになるけど、 // Deconstruct(out int, out int) は呼ばれない。 Console.WriteLine(x is (_, _)); } } } ================================================ FILE: Chapters/Data/Patterns/DiscardPattern.cs ================================================ namespace Patterns.DiscardPattern { class Program { static void Main() { } static int M(object x) => x switch { 0 => 0, string s => s.Length, _ => -1 }; } } namespace Patterns.DiscardPattern.BreakingChange { using System; class _Type { class _ { } static void M(object x) { Console.WriteLine(x is _); // class _ とのマッチ } } class _Constant { const int _ = 0; static void M(object x) { switch (x) { case _: // 定数 _ とのマッチ break; } } } } ================================================ FILE: Chapters/Data/Patterns/Expressions/Node.cs ================================================ namespace Patterns.Expressions { public abstract class Node { public static readonly Node X = new Var(); public static implicit operator Node(int value) => new Const(value); public static Node operator +(Node left, Node right) => new Add(left, right); public static Node operator *(Node left, Node right) => new Mul(left, right); } public class Var : Node { public override string ToString() => "x"; } public class Const : Node { public int Value { get; } public Const(int value) { Value = value; } public void Deconstruct(out int value) => value = Value; public override string ToString() => Value.ToString(); } public class Add : Node { public Node Left { get; } public Node Right { get; } public Add(Node left, Node right) => (Left, Right) = (left, right); public void Deconstruct(out Node left, out Node right) => (left, right) = (Left, Right); public override string ToString() => $"({Left.ToString()} + {Right.ToString()})"; } public class Mul : Node { public Node Left { get; } public Node Right { get; } public Mul(Node left, Node right) => (Left, Right) = (left, right); public void Deconstruct(out Node left, out Node right) => (left, right) = (Left, Right); public override string ToString() => $"{Left.ToString()} * {Right.ToString()}"; } } ================================================ FILE: Chapters/Data/Patterns/Expressions/Program.cs ================================================ namespace Patterns.Expressions { using System; public static class Program { public static int Calculate(this Node n, int x) => n switch { Var _ => x, Const c => c.Value, Add (var l, var r) => l.Calculate(x) + r.Calculate(x), Mul (var l, var r) => l.Calculate(x) * r.Calculate(x), _ => throw new InvalidOperationException() }; public static Node Simplify(this Node n) => n switch { Add (var l, var r) => (l.Simplify(), r.Simplify()) switch { // 0 を足しても変わらない (Const(0), var r1) => r1, (var l1, Const(0)) => l1, // 他 (var l1, var r1) => new Add(l1, r1) }, Mul (var l, var r) => (l.Simplify(), r.Simplify()) switch { // 0 を掛けたら 0 (Const(0) c, _) => c, (_, Const(0) c) => c, // 1 を掛けても変わらない (Const(1), var r1) => r1, (var l1, Const(1)) => l1, // 他 (var l1, var r1) => new Mul(l1, r1) }, _ => n }; public static Node ClassicSimplify(this Node n) { if (n is Add a) { var (l, r) = a; var l1 = l.Simplify(); var r1 = r.Simplify(); { if (l1 is Const c && c.Value == 0) return r1; } { if (r1 is Const c && c.Value == 0) return l1; } return new Add(l1, r1); } if (n is Mul m) { var (l, r) = m; var l1 = l.Simplify(); var r1 = r.Simplify(); { if (l1 is Const c) { if (c.Value == 0) return c; if (c.Value == 1) return r1; } } { if (r1 is Const c) { if (c.Value == 0) return c; if (c.Value == 1) return l1; } } return new Mul(l1, r1); } return n; } static void Main() { var x = Node.X; Console.WriteLine(x * x + 1); Console.WriteLine(((1 * x + 0 * x) * 1).Simplify()); Console.WriteLine(((x + 2) * (x + 3)).Calculate(1)); } } } ================================================ FILE: Chapters/Data/Patterns/Line.cs ================================================ namespace Patterns { public class Line { public Point Start { get; } public Point End { get; } public Line(Point s, Point e) => (Start, End) = (s, e); public void Deconstruct(out Point s, out Point e) => (s, e) = (Start, End); } } ================================================ FILE: Chapters/Data/Patterns/NoOrderGarantee.cs ================================================ namespace Patterns.NoOrderGarantee { using System; enum Type { A, B } class X { public Type Type { get; } public X(Type type) => Type = type; // それぞれ Type が一致しているときだけ値を取り出せ、そうでなければ例外 public int A => Type == Type.A ? 1 : throw new InvalidOperationException(); public int B => Type == Type.B ? 2 : throw new InvalidOperationException(); // 分解でタイプ判定 public void Deconstruct(out Type t) => t = Type; } class Program { static void Main() { Console.WriteLine(M(new X(Type.A))); Console.WriteLine(M(new X(Type.B))); } // 以下のコードはたまたま動く可能性はあるものの、C# の言語使用としては保証がない。 // Deconstruct よりも先にプロパティのアクセスがあると例外が出ることがある。 static int M(X x) => x switch { (Type.A) { A: var a } => a, (Type.B) { B: var b } => b, _ => 0 }; } } ================================================ FILE: Chapters/Data/Patterns/NonNull.cs ================================================ namespace Patterns.NonNull { class Program { struct LongLongNamedStruct { } void M1(LongLongNamedStruct? x) { // こういう書き方だと null チェックになる。 if (x is LongLongNamedStruct nonNull) { // obj が null じゃない時だけここが実行される。 // でも、x の型が既知なのに、長いクラス名をわざわざ書くのはしんどい… } } void M2(LongLongNamedStruct? x) { // が、var パターンは null にもマッチしちゃう。 // (var は「何にでもマッチ」。null でも true になっちゃう。) if (x is var nullable) { // obj が null でもここが実行される。 } } void M3(LongLongNamedStruct? x) { // (C# 8.0) プロパティ パターンであれば、null チェックを含む。 if (x is { } nonNull) { // obj が null じゃない時だけここが実行される。 } } } } ================================================ FILE: Chapters/Data/Patterns/Patterns.csproj ================================================  Exe netcoreapp3.0 Patterns.NoOrderGarantee.Program ================================================ FILE: Chapters/Data/Patterns/Point.cs ================================================ namespace Patterns { public class Point { public int X { get; set; } public int Y { get; set; } public Point(int x = 0, int y = 0) => (X, Y) = (x, y); public void Deconstruct(out int x, out int y) => (x, y) = (X, Y); } } ================================================ FILE: Chapters/Data/Patterns/PositionalPattern.cs ================================================ namespace Patterns.PositionalPattern { class Program { static void Main() { // 位置指定で構築できるんなら、位置指定でマッチングできるべき var p1 = new Point(1, 2); var r1 = p1 is Point (1, 2); // 名前指定で構築できるんなら、名前指定でマッチングできるべき var p2 = new Point(x: 1, y: 2); var r2 = p2 is Point (x: 1, y: 2); #if false // 実装待ち。C# 8.0 候補には入ってる // 型推論が効く場合に new の後ろの型名は省略可能(になる予定)なら // 型が既知なら型名を省略してマッチングできるべき Point p3 = new (1, 2); var r3 = p2 is (1, 2); #endif // 階層的に new できるんなら、階層的にマッチングできるべき var line = new Line(new Point(1, 2), new Point(3, 4)); var r4 = line is ((1, 2), (3, 4)); } static int M(Point p) => p switch { (1, 2) => 0, (var x, _) when x > 0 => x, _ => -1 }; static int M1(Point p) { p.Deconstruct(out var x, out var y); if (x is 1 && y is 2) return 0; if (x > 0) return x; return -1; } static int ExplicitType(object obj) => obj switch { int i => i, string s => s.Length, Point(var x, var y) => 0, _ => -1 }; static int MixPatterns(object obj) => obj switch { Point (var x, _) { Y: var y } p => x * y }; static int NamedPattern(Point p) => p switch { (x: 1, y: 2) => 0, (x: var x, y: _) when x > 0 => x, _ => -1 }; } } ================================================ FILE: Chapters/Data/Patterns/PropertyPattern.cs ================================================ namespace Patterns.PropertyPattern { class Program { public static void Main() { // 初期化子でプロパティ指定できるんなら、プロパティ指定でマッチングできるべき var p1 = new Point { X = 1, Y = 2 }; var r1 = p1 is { X: 1, Y: 2 }; // 混在で構築できるんなら、混在でマッチングできるべき var p2 = new Point(x: 1) { Y = 2 }; var r2 = p2 is (1, _) { Y: 2 }; } static int M(Point p) => p switch { { X: 1, Y: 2 } => 0, { X: var x, Y: _ } when x > 0 => x, _ => -1 }; static int M1(Point p) { var x = p.X; var y = p.Y; if (x is 1 && y is 2) return 0; if (x > 0) return x; return -1; } static int M(object obj) => obj switch { int i => i, string s => s.Length, Point { X: 0, Y: 0 } => 0, Point (_, _) => 1, _ => -1 }; } } ================================================ FILE: Chapters/Data/Patterns/PropertyPatternField.cs ================================================ namespace Patterns.PropertyPatternField { using System; class X { // (外から見て) get-only なプロパティ public int GetOnly { get; private set; } // get/set 可能なプロパティ public int GetSet { get; set; } // フィールド public int Field; // set-only なプロパティ public int SetOnly { set => GetOnly = value; } } class Program { public static void Main() { // オブジェクト初期化子では、set が public なプロパティか readonly ではないフィールドを指定可能 var x = new X { GetSet = 1, Field = 2, SetOnly = 3 }; // プロパティ パターンでは、get が public なプロパティかフィールドを指定可能 Console.WriteLine(x is { GetOnly: 3, GetSet: 1, Field: 2 }); } } } ================================================ FILE: Chapters/Data/Patterns/RecursivePattern.cs ================================================ namespace Patterns.RecursivePattern { class Program { static int M(object obj) => obj switch { 0 => 1, int i => 2, Point (1, _) => 4, // new! Point { X: 2, Y: var y } => y, // new! _ => 0 }; } } ================================================ FILE: Chapters/Data/Patterns/Tuple.cs ================================================ namespace Patterns.Tuple { using System.Runtime.CompilerServices; class X : ITuple { public object this[int index] => index; public int Length => 2; public void Deconstruct(out int a, out int b) => (a, b) = (0, 1); } class Source { public bool TupleSyntax((int a, int b) x) => x is (1, 2); public bool Deconstruct(X x) => x is (1, 2); public bool Object(object x) => x is (1, 2); } class Result { // ValueTuple の場合は直接フィールドを参照する。 public bool TupleSyntax((int a, int b) x) { return x.a == 1 && x.b == 2; } // コンパイル時に Deconstruct メソッドが見つかる場合はそれを使って分解。 public bool Deconstruct(X x) { x.Deconstruct(out var a, out var b); return a == 1 && b == 2; } // コンパイル時の解決ができない場合、ITuple を実装しているかどうかを見る。 // Length とインデクサーを使ってマッチング。 public bool Object(object x) { return x is ITuple t && t.Length == 2 && t[0] is int a && a == 1 && t[1] is int b && b == 1 ; } } } ================================================ FILE: Chapters/Data/Patterns/TupleSwitch.cs ================================================ using System; using System.Collections.Generic; using System.Text; namespace Patterns { class TupleSwitch { int Compare(int? a, int? b) { switch (a, b) { case (a: null, null): return 0; case (int _, null): return -1; case (null, int _): return -1; case (int a1, int b1): return a1.CompareTo(b1); } } } } ================================================ FILE: Chapters/Data/Patterns/TypePattern.cs ================================================ namespace Patterns.TypePattern { using System; class Program { static void Main() { M(1); M("abc"); M(new object()); } static void M(object x) { if (x is int i) Console.WriteLine("int " + i); else if (x is string s) Console.WriteLine("string " + s); } static void M1(object x) { if (x is int) { var i = (int)x; Console.WriteLine("int " + i); } else { string s = x as string; if (s != null) { Console.WriteLine("string " + s); } } } } } ================================================ FILE: Chapters/Data/Patterns/TypePatternNull.cs ================================================ namespace Patterns.TypePatternNull { using System; class Program { static void Main() { M("abc"); // matched abc M(null); // 何も表示されない } static void M(string x) { if (x is string s) Console.WriteLine("matched " + s); } static void M(T x) { Console.WriteLine(x is null); } } } ================================================ FILE: Chapters/Data/Patterns/UserDefinedOperator.cs ================================================ namespace Patterns.UserDefinedOperator { using System; class X { // 全てのインスタンスが等しいという挙動。 // 当然、x == null も常に true。 public static bool operator ==(X a, X b) => true; public static bool operator !=(X a, X b) => false; } class Program { static void Main() { var x = new X(); // なんでも true なので、== null も true Console.WriteLine(x == null); // ユーザー定義の == は見ない。x が本当に null かどうかを見て、false になる Console.WriteLine(x is null); } } } ================================================ FILE: Chapters/Data/Patterns/VarPattern.cs ================================================ namespace Patterns.VarPattern { using System; class Program { static void Main() { MatchNull(); DeclarationExpression(); } static void DeclarationExpression() { while (Console.ReadLine() is var line && !string.IsNullOrEmpty(line)) { Console.WriteLine(line); } } static void MatchNull() { string s = null; Console.WriteLine(s is string x); // false Console.WriteLine(s is var y); // true } static int M(object x) { switch(x) { case 0: return 0; case string s: return s.Length; case var other: return other.GetHashCode(); // あるいは、変数で受け取る必要がないときは _ にしておけば破棄の意味なる // case var _: } } } } ================================================ FILE: Chapters/Data/Patterns/ZeroOneTuple.cs ================================================ namespace Patterns.ZeroOneTuple { using System; class X { public void Deconstruct() { } public void Deconstruct(out int a) => a = 0; } class Program { static void Main() => M(new X()); static void M(X x) { // 0 引数の位置パターン。 // Deconstruct() を持っていることが使える条件。 if (x is ()) Console.WriteLine("Deconstruct()"); // 1 引数の位置パターン。 // Deconstruct(out T) を持っていることが使える条件。 // ただ、キャストの () との区別が難しいらしく、素直に x is (int a) とは書けない。 // 前後に余計な var や _ を付ける必要あり。 if (x is (int a) _) Console.WriteLine($"Deconstruct({a})"); } } } ================================================ FILE: Chapters/Data/Tuples/ErroneousSamples.cs ================================================ namespace Tuples.ErroneousSamples { #if false using System; class Program { static void Main() { () noneple; // ダメ (int x) oneple; // ダメ // タプル構文で書けるのは2つ以上だけ (int x, int y) twople; // OK // タプル構文でなければ、0-tuple, 1-tuple も作れる ValueTuple none; // OK ValueTuple one; // OK } } #endif #if false // using でエイリアスを付けることはできない using T = (int x, int y); class Program { static void Main() { // var t = new T(1, 2); みたいなのと同じノリでは書けない var t1 = new(int x, int y)(1, 2); var t2 = new(int x, int y) { x = 1, y = 2 }; } static void M(object obj) { // is 演算子には使えない if(obj is (int x, int y)) { } } } #endif #if false using System; class Program { static void Main() { var ticks = 100000; // C# 8? DateTime d = new(ticks); // 左辺から型推論して、new DateTime(ticks) が呼ばれる } static void M(object obj) { // C# 8? // is T 扱いじゃなくて、パターン マッチングで obj を x, y に分解 if (obj is (int x, int y)) { Console.WriteLine($"{x}, {y}"); } } } #endif } ================================================ FILE: Chapters/Data/Tuples/Implementation.cs ================================================ #pragma warning disable 219 #pragma warning disable 1998 namespace Tuples.Implementation { using System; using System.Threading.Tasks; class Program { static void Main() { LocalTuple(); LocalTupleImpl(); //Dynamic(); LongTuple(); LongTupleImple(); } private static void LocalTuple() { var t = (x: 3, y: 5); var p = t.x * t.y; var (x, y) = t; Console.WriteLine($"{x} × {y} = {p}"); } private static void LocalTupleImpl() { var t = new ValueTuple(3, 5); // (x: 3, y: 5) var p = t.Item1 * t.Item2; // t.x * t.y var x = t.Item1; var y = t.Item2; Console.WriteLine($"{x} × {y} = {p}"); } private static void Dynamic() { // 匿名型は名前が残る var a = new { x = 3, y = 5 }; var s1 = Sum(a); // 大丈夫 Console.WriteLine(s1); // タプル型は名前を紛失する var t = (x: 3, y: 5); var s2 = Sum(t); // x, yという名前が実行時になくてエラーに Console.WriteLine(s2); } private static dynamic Sum(dynamic d) => d.x + d.y; public (int x, int y) F((int a, int b) t) => (t.a + t.b, t.a - t.b); #if false [return: TupleElementNames(new[] { "x", "y" })] public ValueTuple F([TupleElementNames(new[] { "a", "b" })] ValueTuple t) => new ValueTuple(t.Item1 + t.Item2, t.Item1 - t.Item2); #endif private static void LongTuple() { var t = (1, 2, 3, 4, 5, 6, 7, 8, 9); Console.WriteLine(t.Item9); } private static void LongTupleImple() { var t = new ValueTuple>( 1, 2, 3, 4, 5, 6, 7, new ValueTuple(8, 9)); Console.WriteLine(t.Rest.Item2); } private static void Onetuple() { var noneple = new ValueTuple(); var oneple = new ValueTuple(1); // メンバー2個以上はタプル構文を使える var twople = (1, 2); // new ValueTuple(1, 2); var threeple = (1, 2, 3); // new ValueTuple(1, 2, 3); } #if true // タプルでは0、1は書けない async Task F0() { } async Task F1() => 1; async Task<(int x1, int x2)> F2() => (1, 2); async Task<(int x1, int x2, int x3)> F3() => (1, 2, 3); #else // こう書けると統一性があってきれい(C# 7では書けない) async Task<()> F0() { } async Task<(int x1)> F1() => (1); async Task<(int x1, int x2)> F2() => (1, 2); async Task<(int x1, int x2, int x3)> F3() => (1, 2, 3); #endif } } ================================================ FILE: Chapters/Data/Tuples/OutParams.cs ================================================ #pragma warning disable 1998 #pragma warning disable 649 namespace Tuples.OutParams { using System; using System.Threading.Tasks; /// /// 出力引数(C# 6)版 /// class Out6 { static void F(Point p) { // 事前に変数を用意しないといけない/var 不可 int x, y; // 1個1個 out を付けないといけない Deconstruct(p, out x, out y); Console.WriteLine($"{x}, {y}"); //非同期メソッドには使えない } // 1個1個 out を付けないといけない static void Deconstruct(Point p, out int x, out int y) { // 1個1個代入 x = p.X; y = p.Y; } } /// /// 出力引数(C# 7)版 /// class Out7 { static void F(Point p) { // 変数の事前準備は不要に // でも1個1個 out を付けないといけない Deconstruct(p, out var x, out var y); //Console.WriteLine($"{x}, {y}"); //非同期メソッドには相変わらず使えない } // 1個1個 out を付けないといけない static void Deconstruct(Point p, out int x, out int y) => (x, y) = (p.X, p.Y); } /// /// タプル版 /// class Tuple { static async Task F(Point p) { // 1個の var で受け取れる var t1 = Deconstruct(p); Console.WriteLine($"{t1.x}, {t1.y}"); // 何なら分解と併せればもっと書き心地よく書ける var (x, y) = Deconstruct(p); Console.WriteLine($"{x}, {y}"); // 非同期メソッドで使えるのはタプルだけ var t2 = await DeconstructAsync(p); Console.WriteLine($"{t2.x}, {t2.y}"); } static (int x, int y) Deconstruct(Point p) => (p.X, p.Y); // 1個の式で書けて楽 static async Task<(int x, int y)> DeconstructAsync(Point p) => (p.X, p.Y); } struct Point { public int X; public int Y; } /// /// それでもやっぱり出力引数を使う場面 /// class ButStillOut { // if 内で使うなら bool 1個の戻り値の方が使いやすい static void TryPattern() { var s = Console.ReadLine(); if (int.TryParse(s, out var x)) Console.WriteLine(x); } // if 内で使うならタプルの方が煩雑 static void TuplePattern() { var s = Console.ReadLine(); var (success, x) = Parse(s); if (success) Console.WriteLine(x); } static (bool success, int value) Parse(string s) => int.TryParse(s, out var x) ? (true, x) : (false, 0); // C# 7の is を使って、int? の null チェック static void NullCheckPattern() { var s = Console.ReadLine(); if (ParseOrDefault(s) is int x) Console.WriteLine(x); } static int? ParseOrDefault(string s) => int.TryParse(s, out var x) ? x : default(int?); // これはオーバーロード可能 static void F(out int x, out int y) => (x, y) = (1, 2); static void F(out int id, out string name) => (id, name) = (1, "abc"); // 戻り値でのオーバーロードはできない // コンパイル エラーに static (int x, int y) F() => (1, 2); #if false static (int id, string name) F() => (1, "abc"); #endif } } ================================================ FILE: Chapters/Data/Tuples/Overload.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Tuples.Overload { class Program { static void Main() { } // 型違いのタプルでのオーバーロードは可能 void F((int x, int y) t) { } void F((int x, string y) t) { } #if false // 型が一緒で名前だけ違うタプルでのオーバーロードはダメ。コンパイル エラー void G((int x, int y) t) { } void G((int a, int b) t) { } #endif } } ================================================ FILE: Chapters/Data/Tuples/Program.cs ================================================ #pragma warning disable 219 #pragma warning disable 8123 using System; using System.Collections.Generic; namespace Tuples { class Sample { private (int x, int y) value; public (int x, int y) GetValue() => value; public Sample() { } public Sample(int x, int y) { value = (x, y); } } class Program { static void Main(string[] args) { MemberAccess(); Ref(); DifferentNames(); TypeParameters(); } private static void LocalDenotation() { var s = new Sample(); (int x, int y) t = s.GetValue(); } private static void TypeInference() { var s = new Sample(); var t = s.GetValue(); } #if false // VS 15 RC 以降書けなくなった static void New() { // var t = new T(1, 2); みたいなのと同じノリ var t1 = new (int x, int y) (1, 2); // var t = new T { x = 1, y = 2}; みたいなのと同じノリ var t2 = new (int x, int y) { x = 1, y = 2 }; } #endif static void Deconstruct() { var t = (x: 1, y: 2); // 分解宣言1 (int x1, int y1) = t; // x1, y1 を宣言しつつ、t を分解 // 分解宣言2 var (x2, y2) = t; // 分解宣言の簡易記法 // 分解代入 int x, y; (x, y) = t; // 分解結果を既存の変数に代入 } static void Literal() { // メソッド呼び出し時の F(1, 2); みたいなノリ (int x, int y) t1 = (1, 2); // メソッド呼び出し時の F(x: 1, y: 2); みたいなノリ var t2 = (x: 1, y: 2); } private static void MemberTypeInference() { // これは左辺から型推論が聞くので、null も書ける (string? s, int i) t1 = (null, 1); #if false // これはダメ。null の型が決まらない。 var t2 = (null, 1); #endif } static void MemberAccess() { var t = (x: 1, y: 2); Console.WriteLine(t.x); // 1 Console.WriteLine(t.y); // 2 // メンバーごとに書き換え可能 t.x = 10; t.y = 20; Console.WriteLine(t.x); // 10 Console.WriteLine(t.y); // 20 // タプル自身も書き換え可能 t = (100, 200); Console.WriteLine(t.x); // 100 Console.WriteLine(t.y); // 200 } static void Ref() { var t = (x: 1, y: 2); Swap(ref t.x, ref t.y); Console.WriteLine(t.x); // 2 Console.WriteLine(t.y); // 1 } static void Swap(ref T x, ref T y) { var t = x; x = y; y = t; } static void DifferentNames() { (int s, int t) t1 = (x: 1, y: 2); Console.WriteLine(t1.s); // 1 Console.WriteLine(t1.t); // 2 (int y, int x) t2 = (x: 1, y: 2); Console.WriteLine(t2.x); // 2 Console.WriteLine(t2.y); // 1 } static void DifferentTypes() { { object x = "abc"; // string → object は OK long y = 1; // int → long は OK int? z = 2; // int → int? は OK // ↓ (object x, long y, int? z) t = ("abc", 1, 2); // OK } #if false { string x = 1; // int → string は NG int y = 1L; // long → int は NG int z = default(int?); // int? → int は NG // ↓ (string x, int y, int z) t = (1, 1L, default(int?)); // NG } #endif } static void NestedTuples() { // タプルの入れ子 (string a, (int x, int y) b) t1 = ("abc", (1, 2)); Console.WriteLine(t1.a); // abc Console.WriteLine(t1.b.x); // 1 Console.WriteLine(t1.b.y); // 2 // 型推論も可能 var t2 = (a: "abc", b: (x: 1, y: 2)); } static void TypeParameters() { var dic = new Dictionary<(string s, string t), (int x, int y)> { { ("a", "b"), (1, 2) }, { ("x", "y"), (4, 8) }, }; Console.WriteLine(dic[("a", "b")]); // (1, 2) } static void AnonymousMember() { var t1 = (1, 2); Console.WriteLine(t1.Item1); // 1 Console.WriteLine(t1.Item2); // 2 //var t2 = (x: 1, 2); // 次のプレビューにはこれできるようになるはず } } } ================================================ FILE: Chapters/Data/Tuples/Summary.cs ================================================ namespace Tuples.Summary { using System; using System.Collections.Generic; class Program { // タプルを使って2つの戻り値を返す static (int count, int sum) Tally(IEnumerable items) { var count = 0; var sum = 0; foreach (var x in items) { sum += x; count++; } return (count, sum); } static void Main() { var data = new[] { 1, 2, 3, 4, 5 }; var t = Tally(data); Console.WriteLine($"{t.sum}/{t.count}"); } } } ================================================ FILE: Chapters/Data/Tuples/Tuples.csproj ================================================  Exe netcoreapp3.0 Tuples.Program ================================================ FILE: Chapters/Data/Tuples/ValueTuple.cs ================================================ using System; using System.Collections; using System.Runtime.InteropServices; namespace Tuples.X { [StructLayout(LayoutKind.Auto)] public struct ValueTuple //: IEquatable>, IStructuralEquatable, IStructuralComparable, IComparable, IComparable> { public T1 Item1; public T2 Item2; public ValueTuple(T1 item1, T2 item2) { Item1 = item1; Item2 = item2; } // 後略、インターフェイスのメンバー定義 } } ================================================ FILE: Chapters/Data/Tuples/ZipSample.cs ================================================ namespace Tuples.ZipSample { using System; using System.Collections.Generic; using System.Linq; class Program { static void Main() { int[] a1 = new[] { 1, 2, 3 }; string[] a2 = new[] { "a", "b", "c" }; // 配列 ×2のタプルに対して、IEnumerable ×2のタプルの拡張メソッドを呼べる foreach (var (i, s) in (a1, a2).Zip()) { Console.WriteLine($"{i}: {s}"); } } } static class TupelExtensions { // IEnumerable ×2 に対する拡張メソッド public static IEnumerable<(T1 x1, T2 x2)> Zip(this (IEnumerable items1, IEnumerable items2) t) => t.items1.Zip(t.items2, (x1, x2) => (x1, x2)); } } ================================================ FILE: Chapters/Data/TypeSwitch/Expressions/Calculate.switcha.cs ================================================ using System; namespace TypeSwitch.Expressions { public static partial class NodeExtensions { public static int Calculate(this Node n, int x) { switch (n) { case Var v: return x; case Const c: return c.Value; case Add a: return Calculate(a.Left, x) + Calculate(a.Right, x); case Mul m: return Calculate(m.Left, x) * Calculate(m.Right, x); } throw new ArgumentOutOfRangeException(); } } } ================================================ FILE: Chapters/Data/TypeSwitch/Expressions/Calculate.vritual.cs ================================================ namespace TypeSwitch.Expressions { abstract partial class Node { public abstract int Calculate(int x); } partial class Var { public override int Calculate(int x) => x; } partial class Const { public override int Calculate(int x) => Value; } partial class Add { public override int Calculate(int x) => Left.Calculate(x) + Right.Calculate(x); } partial class Mul { public override int Calculate(int x) => Left.Calculate(x) * Right.Calculate(x); } } ================================================ FILE: Chapters/Data/TypeSwitch/Expressions/Node.cs ================================================ namespace TypeSwitch.Expressions { public partial class Node { } public partial class Var : Node { } public partial class Const : Node { public int Value { get; } public Const(int value) { Value = value; } } public partial class Add : Node { public Node Left { get; } public Node Right { get; } public Add(Node left, Node right) { Left = left; Right = right; } } public partial class Mul : Node { public Node Left { get; } public Node Right { get; } public Mul(Node left, Node right) { Left = left; Right = right; } } } ================================================ FILE: Chapters/Data/TypeSwitch/Expressions/NodeBuilder.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TypeSwitch.Expressions { partial class Node { public static readonly Node X = new Var(); public static implicit operator Node(int v) => new Const(v); public static Node operator+(Node l, Node r) => new Add(l, r); public static Node operator*(Node l, Node r) => new Mul(l, r); } } ================================================ FILE: Chapters/Data/TypeSwitch/Expressions/Program.cs ================================================ namespace TypeSwitch.Expressions { using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; class Program { static void Main() { var x = Node.X; var expressions = new[] { x * x + 1, 2 * x + 3, x * x + 2 * x + 1, 5 * x * x * x * x * x + 4 * x * x * x * x + 3 * x * x * x + 2 * x * x + 1, }; var values = new[] { 1, 2, 3, 5, 7, 11 }; WriteResults(expressions, values); const int N = 100000; var sw = new Stopwatch(); sw.Start(); for (int i = 0; i < N; i++) foreach (var ex in expressions) foreach (var v in values) ex.Calculate(v); sw.Stop(); Console.WriteLine("virtual method: " + sw.Elapsed); sw.Reset(); sw.Start(); for (int i = 0; i < N; i++) foreach (var ex in expressions) foreach (var v in values) NodeExtensions.Calculate(ex, v); sw.Stop(); Console.WriteLine("type switch : " + sw.Elapsed); } private static void WriteResults(Node[] expressions, int[] values) { foreach (var ex in expressions) { foreach (var v in values) { var r = ex.Calculate(v); Console.WriteLine($"{ex.ToCsharpCode()} --[x = {v}]-> {r}"); } } } } } ================================================ FILE: Chapters/Data/TypeSwitch/Expressions/ToString.cs ================================================ using System; namespace TypeSwitch.Expressions { public static partial class NodeExtensions { public static string ToCsharpCode(this Node n) { switch (n) { case Var v: return "x"; case Const c: return c.Value.ToString(); case Add a: return a.Left.ToCsharpCode() + " + " + a.Right.ToCsharpCode(); case Mul m: return m.Left.ToCsharpCode() + " * " + m.Right.ToCsharpCode(); } throw new ArgumentOutOfRangeException(); } } } ================================================ FILE: Chapters/Data/TypeSwitch/IsSample.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TypeSwitch { class IsSample { static void 型判定のみ(object obj) { // 型判定のみなら、これまでの is 演算子でも十分 if (obj is string) Console.WriteLine("string"); } static void 型変換もしたい(object obj) { // 型変換もしたい if (obj is string) { var s = (string)obj; //↑ isとキャストで2つの別命令を使う。二重処理になってるだけで無駄 Console.WriteLine("string #" + s.Length); } { // 結局、as 演算子 + null チェックを使うことになる var s = obj as string; if (s != null) { Console.WriteLine("string #" + s.Length); } } } static void TypeSwitch(object obj) { // C# 7での新しい書き方 if (obj is string s) { Console.WriteLine("string #" + s.Length); } } static void NullCheck() { string x = null!; if (x is string) { // x の変数の型は string なのに、is string は false // is 演算子は変数の実行時の中身を見る & null には型がない Console.WriteLine("ここは絶対通らない"); } } static void F(string nullable) { if (nullable is string nonNull) { Console.WriteLine(nonNull.Length); } } static void F(int? x) { #if false // C# 6以前の書き方 if (x.HasValue) { // この「.Value」が結構うっとおしい Console.WriteLine(x.Value * x.Value); } #else if (x is int n) { Console.WriteLine(n * n); } #endif #if false static void F(object obj) { if (obj is string) { // この中では obj を string 扱いできる言語がある // C# ではコンパイル エラー Console.WriteLine("string #" + obj.Length); } else if (obj is int) { // 同上、int 扱いできる言語がある // C# ではコンパイル エラー Console.WriteLine("int " + (obj * obj)); } } static void F(object x) { if (x is string x) { // 引数の x とは別に、is 演算子で別の「x」を導入できる言語もある // C# ではコンパイル エラー Console.WriteLine("string #" + x.Length); } } #endif } } } ================================================ FILE: Chapters/Data/TypeSwitch/Program.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TypeSwitch { class Program { static void Main(string[] args) { } } } ================================================ FILE: Chapters/Data/TypeSwitch/Summary.cs ================================================ using System; namespace TypeSwitch.Summary { class Program { static void F(object obj) { if (obj is string s) { Console.WriteLine("string #" + s.Length); } switch (obj) { case 7: Console.WriteLine("7の時だけここに来る"); break; case int n when n > 0: Console.WriteLine("正の数の時にここに来る " + n); // ただし、上から順に判定するので、7 の時には来なくなる break; case int n: Console.WriteLine("整数の時にここに来る" + n); // 同上、0 以下の時にしか来ない break; default: Console.WriteLine("その他"); break; } } } } ================================================ FILE: Chapters/Data/TypeSwitch/SwitchPerformance.cs ================================================ namespace SwitchPerformance { using System; using System.Diagnostics; class Program { static void Main() { var sw = new Stopwatch(); // bool 型は一番先頭 = 速い object t = true; sw.Start(); for (int i = 0; i < 100000; i++) TypeSwitch(t); sw.Stop(); Console.WriteLine("bool " + sw.Elapsed); // かなり速いはず // double 型は一番末尾 = 遅い object d = 1.1; sw.Restart(); for (int i = 0; i < 100000; i++) TypeSwitch(d); sw.Stop(); Console.WriteLine("string " + sw.Elapsed); // 手元の環境では5倍くらい遅かった // どの case にもない型。default 句に行く var s = DateTime.UtcNow; sw.Restart(); for (int i = 0; i < 100000; i++) TypeSwitch(s); sw.Stop(); Console.WriteLine("string " + sw.Elapsed); // 一番最後まで判定するので遅い } static int TypeSwitch(object x) { switch (x) { default: return -1; // ちなみに、default 句はどこに書こうと必ず一番最後 case bool _: return 0; // 前から順に判定ということは、bool の時が一番早い case sbyte _: return 1; case byte _: return 2; case short _: return 3; case ushort _: return 4; case int _: return 5; case uint _: return 6; case long _: return 7; case ulong _: return 8; case float _: return 9; case double _: return 10; // 逆に double の時は凄く遅い } } } } ================================================ FILE: Chapters/Data/TypeSwitch/SwitchSample.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TypeSwitch { class SwitchSample { static void F(object obj) { switch (obj) { case string s: Console.WriteLine("string #" + s.Length); break; case 7: Console.WriteLine("7の時だけここに来る"); break; case int n when n > 0: Console.WriteLine("正の数の時にここに来る " + n); // ただし、上から順に判定するので、7 の時には来なくなる break; case int n: Console.WriteLine("整数の時にここに来る" + n); // 同上、0 以下の時にしか来ない break; default: Console.WriteLine("その他"); break; } } static void TypeSwitch(object obj) { switch (obj) { case int n: Console.WriteLine("整数 " + n); break; case string s: Console.WriteLine("文字列 " + s); break; default: Console.WriteLine("その他"); break; } } static string 値だけでswitch(int n) { switch(n) { case 0: return "zero"; case 1: return "one"; case 2: return "two"; case 3: return "three"; case 4: return "four"; case 5: return "five"; case 6: return "six"; case 7: return "seven"; case 8: return "eight"; case 9: return "nine"; default: return "other"; } } static string ジャンプテーブル化(int n) { var map = new Dictionary { { 0, "zero" }, { 1, "one" }, { 2, "two" }, { 3, "three" }, { 4, "four" }, { 5, "five" }, { 6, "six" }, { 7, "seven" }, { 8, "eight" }, { 9, "nine" }, }; if (map.TryGetValue(n, out var s)) return s; else return "other"; } } } ================================================ FILE: Chapters/Data/TypeSwitch/TypeSwitch.csproj ================================================  Exe netcoreapp3.0 TypeSwitch.Program ================================================ FILE: Chapters/Data/TypeSwitch/TypeSwitchPerformance.cs ================================================ namespace TypeSwitch.TypeSwitchPerformance { using System; using System.Diagnostics; class Program { static void Main() { var sw = new Stopwatch(); // bool 型は一番先頭 = 速い object t = true; sw.Start(); for (int i = 0; i < 100000; i++) TypeSwitch(t); sw.Stop(); Console.WriteLine("bool " + sw.Elapsed); // かなり速いはず // double 型は一番末尾 = 遅い object d = 1.1; sw.Restart(); for (int i = 0; i < 100000; i++) TypeSwitch(d); sw.Stop(); Console.WriteLine("string " + sw.Elapsed); // 手元の環境では5倍くらい遅かった // どの case にもない型。default 句に行く var s = DateTime.UtcNow; sw.Restart(); for (int i = 0; i < 100000; i++) TypeSwitch(s); sw.Stop(); Console.WriteLine("string " + sw.Elapsed); // 一番最後まで判定するので遅い } static int TypeSwitch(object x) { switch (x) { default: return -1; // ちなみに、default 句はどこに書こうと必ず一番最後 case bool _: return 0; // 前から順に判定ということは、bool の時が一番早い case sbyte _: return 1; case byte _: return 2; case short _: return 3; case ushort _: return 4; case int _: return 5; case uint _: return 6; case long _: return 7; case ulong _: return 8; case float _: return 9; case double _: return 10; // 逆に double の時は凄く遅い } } } } ================================================ FILE: Chapters/DevEnv/CodeAwareLibrarySample/.gitignore ================================================ !FluentArithmetic.Nupkg !build ================================================ FILE: Chapters/DevEnv/CodeAwareLibrarySample/CodeAwareLibrarySample.sln ================================================  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 VisualStudioVersion = 14.0.25420.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FluentArithmeticAnalyzer", "FluentArithmeticAnalyzer\FluentArithmeticAnalyzer\FluentArithmeticAnalyzer.csproj", "{F08AC1C8-AA28-49FB-8D92-FF9BE827E75E}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FluentArithmeticAnalyzer.Test", "FluentArithmeticAnalyzer\FluentArithmeticAnalyzer.Test\FluentArithmeticAnalyzer.Test.csproj", "{CC884804-54C8-4037-B0F2-5A2FD244E28F}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FluentArithmeticAnalyzer.Vsix", "FluentArithmeticAnalyzer\FluentArithmeticAnalyzer.Vsix\FluentArithmeticAnalyzer.Vsix.csproj", "{F56992C4-EA05-4DBA-95E0-2FF1CA329606}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FluentArithmetic", "FluentArithmetic\FluentArithmetic.csproj", "{CFD35C67-C0D4-4196-92E8-14975FD3A7A1}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {F08AC1C8-AA28-49FB-8D92-FF9BE827E75E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F08AC1C8-AA28-49FB-8D92-FF9BE827E75E}.Debug|Any CPU.Build.0 = Debug|Any CPU {F08AC1C8-AA28-49FB-8D92-FF9BE827E75E}.Release|Any CPU.ActiveCfg = Release|Any CPU {F08AC1C8-AA28-49FB-8D92-FF9BE827E75E}.Release|Any CPU.Build.0 = Release|Any CPU {CC884804-54C8-4037-B0F2-5A2FD244E28F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CC884804-54C8-4037-B0F2-5A2FD244E28F}.Debug|Any CPU.Build.0 = Debug|Any CPU {CC884804-54C8-4037-B0F2-5A2FD244E28F}.Release|Any CPU.ActiveCfg = Release|Any CPU {CC884804-54C8-4037-B0F2-5A2FD244E28F}.Release|Any CPU.Build.0 = Release|Any CPU {F56992C4-EA05-4DBA-95E0-2FF1CA329606}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F56992C4-EA05-4DBA-95E0-2FF1CA329606}.Debug|Any CPU.Build.0 = Debug|Any CPU {F56992C4-EA05-4DBA-95E0-2FF1CA329606}.Release|Any CPU.ActiveCfg = Release|Any CPU {F56992C4-EA05-4DBA-95E0-2FF1CA329606}.Release|Any CPU.Build.0 = Release|Any CPU {CFD35C67-C0D4-4196-92E8-14975FD3A7A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CFD35C67-C0D4-4196-92E8-14975FD3A7A1}.Debug|Any CPU.Build.0 = Debug|Any CPU {CFD35C67-C0D4-4196-92E8-14975FD3A7A1}.Release|Any CPU.ActiveCfg = Release|Any CPU {CFD35C67-C0D4-4196-92E8-14975FD3A7A1}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal ================================================ FILE: Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmetic/FluentArithmetic.csproj ================================================ 14.0 Debug AnyCPU {CFD35C67-C0D4-4196-92E8-14975FD3A7A1} Library Properties FluentArithmetic FluentArithmetic ja-JP 512 {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} v5.0 true full false bin\Debug\ DEBUG;TRACE prompt 4 pdbonly true bin\Release\ TRACE prompt 4 ================================================ FILE: Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmetic/FluentExtensions.cs ================================================ namespace FluentArithmetic { public static class FluentExtensions { public static int Add(this int x, int y) => x + y; public static int Sub(this int x, int y) => x - y; public static int Mul(this int x, int y) => x * y; public static int Div(this int x, int y) => x / y; } } ================================================ FILE: Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmetic/Properties/AssemblyInfo.cs ================================================ using System.Resources; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // アセンブリに関する一般情報は以下の属性セットをとおして制御されます。 // アセンブリに関連付けられている情報を変更するには、 // これらの属性値を変更してください。 [assembly: AssemblyTitle("FluentArithmetic")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("FluentArithmetic")] [assembly: AssemblyCopyright("Copyright (C) 2015")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: NeutralResourcesLanguage("ja")] // アセンブリのバージョン情報は、以下の 4 つの値で構成されています: // // メジャー バージョン // マイナー バージョン // ビルド番号 // リビジョン // // すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を // 既定値にすることができます: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] ================================================ FILE: Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmetic/project.json ================================================ { "supports": {}, "dependencies": { "Microsoft.NETCore.Portable.Compatibility": "1.0.1", "NETStandard.Library": "1.6.0" }, "frameworks": { "netstandard1.1": {} } } ================================================ FILE: Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer/Assembly.cs ================================================ [assembly: System.Runtime.CompilerServices.InternalsVisibleTo("FluentArithmeticAnalyzer.Test")] ================================================ FILE: Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer/DivByZero/DivByZeroAnalyzer.cs ================================================ using System.Collections.Immutable; using System.Linq; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; namespace FluentArithmeticAnalyzer.DivByZero { [DiagnosticAnalyzer(LanguageNames.CSharp)] public class DivByZeroAnalyzer : DiagnosticAnalyzer { public const string DiagnosticId = "DivByZeroAnalyzer"; internal static readonly LocalizableString Title = "Call 'Div' by 0"; internal static readonly LocalizableString MessageFormat = "Do not call the 'Div' method with 'y' being 0."; internal const string Category = "Correction"; internal static DiagnosticDescriptor Rule = new DiagnosticDescriptor(DiagnosticId, Title, MessageFormat, Category, DiagnosticSeverity.Error, true); public override ImmutableArray SupportedDiagnostics => ImmutableArray.Create(Rule); public override void Initialize(AnalysisContext context) { context.RegisterSyntaxNodeAction(AnalyzeMethod, SyntaxKind.MethodDeclaration); } private void AnalyzeMethod(SyntaxNodeAnalysisContext context) { var invocations = context.Node .DescendantNodes() .OfType(); foreach (var ex in invocations) { var method = ex.GetFluentExtensionsMember(context); if (method == null) continue; var literal = ex.GetLiteralArgument(); if (literal == null) continue; if (method.Name == "Div" && literal.Token.ValueText == "0") { var diagnostic = Diagnostic.Create(Rule, literal.GetLocation()); context.ReportDiagnostic(diagnostic); } } } } } ================================================ FILE: Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer.csproj ================================================ 11.0 Debug AnyCPU {F08AC1C8-AA28-49FB-8D92-FF9BE827E75E} Library Properties FluentArithmeticAnalyzer FluentArithmeticAnalyzer {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} Profile7 v4.5 true full false bin\Debug\ DEBUG;TRACE prompt 4 pdbonly true bin\Release\ TRACE prompt 4 True True Resources.resx ResXFileCodeGenerator Resources.Designer.cs OnOutputUpdated ================================================ FILE: Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer/Literal/LiteralAnalyzer.cs ================================================ using System.Collections.Immutable; using System.Linq; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; namespace FluentArithmeticAnalyzer.Literal { [DiagnosticAnalyzer(LanguageNames.CSharp)] public class LiteralAnalyzer : DiagnosticAnalyzer { public const string DiagnosticId = "LiteralAnalyzer"; internal static readonly LocalizableString Title = "Arithmetic operation on two literals"; internal static readonly LocalizableString MessageFormat = "Call the {0} with two literals"; internal const string Category = "Correction"; internal static DiagnosticDescriptor Rule = new DiagnosticDescriptor(DiagnosticId, Title, MessageFormat, Category, DiagnosticSeverity.Info, true); public override ImmutableArray SupportedDiagnostics { get { return ImmutableArray.Create(Rule); } } public override void Initialize(AnalysisContext context) { context.RegisterSyntaxNodeAction(AnalyzeMethod, SyntaxKind.MethodDeclaration); } private void AnalyzeMethod(SyntaxNodeAnalysisContext context) { var invocations = context.Node .DescendantNodes() .OfType(); foreach (var ex in invocations) { var method = ex.GetFluentExtensionsMember(context); if (method == null) continue; var literal = ex.GetLiteralArgument(); if (literal == null) continue; if (method.Name == "Div" && literal.Token.ValueText == "0") continue; var obj = ex.GetLiteralExpression(); if (obj == null) continue; var diagnostic = Diagnostic.Create(Rule, ex.GetLocation(), method.Name); context.ReportDiagnostic(diagnostic); } } } } ================================================ FILE: Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer/Literal/LiteralFix.cs ================================================ using System; using System.Composition; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; using System.Threading; using System.Threading.Tasks; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CodeFixes; using Microsoft.CodeAnalysis.CodeActions; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Rename; using Microsoft.CodeAnalysis.Text; namespace FluentArithmeticAnalyzer.Literal { [ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(LiteralFix)), Shared] public class LiteralFix : CodeFixProvider { public sealed override ImmutableArray FixableDiagnosticIds => ImmutableArray.Create(LiteralAnalyzer.DiagnosticId); public sealed override FixAllProvider GetFixAllProvider() => WellKnownFixAllProviders.BatchFixer; public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context) { var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken); var expr = root.FindNode(context.Span).FirstAncestorOrSelf(); if (expr != null) { context.RegisterCodeFix( CodeAction.Create("Optimize to one literal", c => ChangeToOneLiteral(expr, context.Document, c)), context.Diagnostics[0]); } } private async Task ChangeToOneLiteral(InvocationExpressionSyntax ex, Document document, CancellationToken cancellationToken) { var literal1 = ex.GetLiteralExpression(); if (literal1 == null) return document; var literal2 = ex.GetLiteralArgument(); if (literal2 == null) return document; var x = int.Parse(literal1.Token.ValueText); var y = int.Parse(literal2.Token.ValueText); var newValue = 0; switch (ex.GetMemberName()) { case "Add": newValue = x + y; break; case "Sub": newValue = x - y; break; case "Mul": newValue = x * y; break; case "Div": newValue = x / y; break; } var newLiteral = SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(newValue)) .WithLeadingTrivia(ex.GetLeadingTrivia()) .WithTrailingTrivia(ex.GetTrailingTrivia()) ; var oldRoot = await document.GetSyntaxRootAsync(cancellationToken); var newRoot = oldRoot.ReplaceNode(ex, newLiteral); return document.WithSyntaxRoot(newRoot); } } } ================================================ FILE: Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer/Properties/AssemblyInfo.cs ================================================ using System.Reflection; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("FluentArithmeticAnalyzer")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("FluentArithmeticAnalyzer")] [assembly: AssemblyCopyright("Copyright © 2015")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyFileVersion("1.0.0.0")] ================================================ FILE: Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer/Resources.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace FluentArithmeticAnalyzer { using System; using System.Reflection; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Resources() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("FluentArithmeticAnalyzer.Resources", typeof(Resources).GetTypeInfo().Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Type names should be all uppercase.. /// internal static string AnalyzerDescription { get { return ResourceManager.GetString("AnalyzerDescription", resourceCulture); } } /// /// Looks up a localized string similar to Type name '{0}' contains lowercase letters. /// internal static string AnalyzerMessageFormat { get { return ResourceManager.GetString("AnalyzerMessageFormat", resourceCulture); } } /// /// Looks up a localized string similar to Type name contains lowercase letters. /// internal static string AnalyzerTitle { get { return ResourceManager.GetString("AnalyzerTitle", resourceCulture); } } } } ================================================ FILE: Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer/Resources.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Type names should be all uppercase. An optional longer localizable description of the diagnostic. Type name '{0}' contains lowercase letters The format-able message the diagnostic displays. Type name contains lowercase letters The title of the diagnostic. ================================================ FILE: Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer/SyntaxExtensions.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; namespace FluentArithmeticAnalyzer { internal static class SyntaxExtensions { public static ISymbol GetFluentExtensionsMember(this InvocationExpressionSyntax expr, SyntaxNodeAnalysisContext context) { var ma = expr.Expression as MemberAccessExpressionSyntax; if (ma == null) return null; var method = context.SemanticModel.GetMemberGroup(ma).FirstOrDefault(); if (method == null) return null; var ct = method.ContainingType; if (ct.ContainingNamespace.Name != "FluentArithmetic" || ct.Name != "FluentExtensions") return null; return method; } public static LiteralExpressionSyntax GetLiteralArgument(this InvocationExpressionSyntax expr) { if (expr.ArgumentList == null) return null; var args = expr.ArgumentList.Arguments; if (args.Count != 1) return null; var arg = args[0].Expression; if (!arg.IsKind(SyntaxKind.NumericLiteralExpression)) return null; return arg as LiteralExpressionSyntax; } public static LiteralExpressionSyntax GetLiteralExpression(this InvocationExpressionSyntax expr) { var ma = expr.Expression as MemberAccessExpressionSyntax; if (ma == null) return null; var obj = ma.Expression; if (!obj.IsKind(SyntaxKind.NumericLiteralExpression)) return null; return obj as LiteralExpressionSyntax; } public static string GetMemberName(this InvocationExpressionSyntax expr) { var ma = expr.Expression as MemberAccessExpressionSyntax; if (ma == null) return null; return ma.Name.Identifier.ValueText; } } } ================================================ FILE: Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer/project.json ================================================ { "supports": {}, "dependencies": { "Microsoft.CodeAnalysis.Analyzers": "1.1.0", "Microsoft.CodeAnalysis.CSharp.Workspaces": "1.2.2" }, "frameworks": { ".NETPortable,Version=v4.5,Profile=Profile7": {} } } ================================================ FILE: Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer.Test/DivByZeroUnitTest.cs ================================================ using FluentArithmeticAnalyzer.DivByZero; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CodeFixes; using Microsoft.CodeAnalysis.Diagnostics; using Microsoft.VisualStudio.TestTools.UnitTesting; using TestHelper; namespace FluentArithmeticAnalyzer.Test { [TestClass] public class DivByZeroUnitTest : CodeFixVerifier { [TestMethod] public void TestMethod1() { var test = @"using System; using FluentArithmetic; class Program { static void Main(string[] args) { var x = 1.Add(2).Mul(3).Sub(1).Div(4); Console.WriteLine(x); } } "; VerifyCSharpDiagnostic(test); } [TestMethod] public void TestMethod2() { var test = @"using System; using FluentArithmetic; class Program { static void Main(string[] args) { var x = 1.Add(2).Mul(3).Sub(1).Div(0); Console.WriteLine(x); } } "; var expected = new DiagnosticResult { Id = DivByZeroAnalyzer.DiagnosticId, Message = DivByZeroAnalyzer.MessageFormat.ToString(), Severity = DiagnosticSeverity.Error, Locations = new[] { new DiagnosticResultLocation("Test0.cs", 8, 44) } }; VerifyCSharpDiagnostic(test, expected); } protected override CodeFixProvider GetCSharpCodeFixProvider() => null; protected override DiagnosticAnalyzer GetCSharpDiagnosticAnalyzer() => new DivByZeroAnalyzer(); } } ================================================ FILE: Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer.Test/FluentArithmeticAnalyzer.Test.csproj ================================================  Debug AnyCPU 8.0.30703 2.0 {CC884804-54C8-4037-B0F2-5A2FD244E28F} Library Properties FluentArithmeticAnalyzer.Test FluentArithmeticAnalyzer.Test v4.6 512 true full false bin\Debug\ DEBUG;TRACE prompt 4 false pdbonly true bin\Release\ TRACE prompt 4 false ..\..\packages\Microsoft.CodeAnalysis.Common.1.2.2\lib\net45\Microsoft.CodeAnalysis.dll True ..\..\packages\Microsoft.CodeAnalysis.CSharp.1.2.2\lib\net45\Microsoft.CodeAnalysis.CSharp.dll True ..\..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.2\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll True ..\..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.2\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll True ..\..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.2\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll True ..\..\packages\System.Collections.Immutable.1.1.37\lib\dotnet\System.Collections.Immutable.dll True ..\..\packages\Microsoft.Composition.1.0.27\lib\portable-net45+win8+wp8+wpa81\System.Composition.AttributedModel.dll True ..\..\packages\Microsoft.Composition.1.0.27\lib\portable-net45+win8+wp8+wpa81\System.Composition.Convention.dll True ..\..\packages\Microsoft.Composition.1.0.27\lib\portable-net45+win8+wp8+wpa81\System.Composition.Hosting.dll True ..\..\packages\Microsoft.Composition.1.0.27\lib\portable-net45+win8+wp8+wpa81\System.Composition.Runtime.dll True ..\..\packages\Microsoft.Composition.1.0.27\lib\portable-net45+win8+wp8+wpa81\System.Composition.TypedParts.dll True ..\..\packages\System.Reflection.Metadata.1.2.0\lib\portable-net45+win8\System.Reflection.Metadata.dll True {cfd35c67-c0d4-4196-92e8-14975fd3a7a1} FluentArithmetic {F08AC1C8-AA28-49FB-8D92-FF9BE827E75E} FluentArithmeticAnalyzer ================================================ FILE: Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer.Test/Helpers/CodeFixVerifier.Helper.cs ================================================ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CodeActions; using Microsoft.CodeAnalysis.Formatting; using Microsoft.CodeAnalysis.Simplification; using System.Collections.Generic; using System.Linq; using System.Threading; namespace TestHelper { /// /// Diagnostic Producer class with extra methods dealing with applying codefixes /// All methods are static /// public abstract partial class CodeFixVerifier : DiagnosticVerifier { /// /// Apply the inputted CodeAction to the inputted document. /// Meant to be used to apply codefixes. /// /// The Document to apply the fix on /// A CodeAction that will be applied to the Document. /// A Document with the changes from the CodeAction private static Document ApplyFix(Document document, CodeAction codeAction) { var operations = codeAction.GetOperationsAsync(CancellationToken.None).Result; var solution = operations.OfType().Single().ChangedSolution; return solution.GetDocument(document.Id); } /// /// Compare two collections of Diagnostics,and return a list of any new diagnostics that appear only in the second collection. /// 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, /// this method may not necessarily return the new one. /// /// The Diagnostics that existed in the code before the CodeFix was applied /// The Diagnostics that exist in the code after the CodeFix was applied /// A list of Diagnostics that only surfaced in the code after the CodeFix was applied private static IEnumerable GetNewDiagnostics(IEnumerable diagnostics, IEnumerable newDiagnostics) { var oldArray = diagnostics.OrderBy(d => d.Location.SourceSpan.Start).ToArray(); var newArray = newDiagnostics.OrderBy(d => d.Location.SourceSpan.Start).ToArray(); int oldIndex = 0; int newIndex = 0; while (newIndex < newArray.Length) { if (oldIndex < oldArray.Length && oldArray[oldIndex].Id == newArray[newIndex].Id) { ++oldIndex; ++newIndex; } else { yield return newArray[newIndex++]; } } } /// /// Get the existing compiler diagnostics on the inputted document. /// /// The Document to run the compiler diagnostic analyzers on /// The compiler diagnostics that were found in the code private static IEnumerable GetCompilerDiagnostics(Document document) => document.GetSemanticModelAsync().Result.GetDiagnostics(); /// /// Given a document, turn it into a string based on the syntax root /// /// The Document to be converted to a string /// A string containing the syntax of the Document after formatting private static string GetStringFromDocument(Document document) { var simplifiedDoc = Simplifier.ReduceAsync(document, Simplifier.Annotation).Result; var root = simplifiedDoc.GetSyntaxRootAsync().Result; root = Formatter.Format(root, Formatter.Annotation, simplifiedDoc.Project.Solution.Workspace); return root.GetText().ToString(); } } } ================================================ FILE: Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer.Test/Helpers/DiagnosticResult.cs ================================================ using Microsoft.CodeAnalysis; using System; namespace TestHelper { /// /// Location where the diagnostic appears, as determined by path, line number, and column number. /// public struct DiagnosticResultLocation { public DiagnosticResultLocation(string path, int line, int column) { if (line < 0 && column < 0) { throw new ArgumentOutOfRangeException("At least one of line and column must be > 0"); } if (line < -1 || column < -1) { throw new ArgumentOutOfRangeException("Both line and column must be >= -1"); } this.Path = path; this.Line = line; this.Column = column; } public string Path; public int Line; public int Column; } /// /// Struct that stores information about a Diagnostic appearing in a source /// public struct DiagnosticResult { private DiagnosticResultLocation[] locations; public DiagnosticResultLocation[] Locations { get { if (this.locations == null) { this.locations = new DiagnosticResultLocation[] { }; } return this.locations; } set { this.locations = value; } } public DiagnosticSeverity Severity { get; set; } public string Id { get; set; } public string Message { get; set; } public string Path => this.Locations.Length > 0 ? this.Locations[0].Path : ""; public int Line => this.Locations.Length > 0 ? this.Locations[0].Line : -1; public int Column => this.Locations.Length > 0 ? this.Locations[0].Column : -1; } } ================================================ FILE: Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer.Test/Helpers/DiagnosticVerifier.Helper.cs ================================================ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.Diagnostics; using Microsoft.CodeAnalysis.Text; using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; using System.Threading; namespace TestHelper { /// /// Class for turning strings into documents and getting the diagnostics on them /// All methods are static /// public abstract partial class DiagnosticVerifier { private static readonly MetadataReference CorlibReference = MetadataReference.CreateFromFile(typeof(object).Assembly.Location); private static readonly MetadataReference SystemCoreReference = MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location); private static readonly MetadataReference CSharpSymbolsReference = MetadataReference.CreateFromFile(typeof(CSharpCompilation).Assembly.Location); private static readonly MetadataReference CodeAnalysisReference = MetadataReference.CreateFromFile(typeof(Compilation).Assembly.Location); private static readonly MetadataReference FluentArithmeticReference = MetadataReference.CreateFromFile(typeof(FluentArithmetic.FluentExtensions).Assembly.Location); internal static string DefaultFilePathPrefix = "Test"; internal static string CSharpDefaultFileExt = "cs"; internal static string VisualBasicDefaultExt = "vb"; internal static string CSharpDefaultFilePath = DefaultFilePathPrefix + 0 + "." + CSharpDefaultFileExt; internal static string VisualBasicDefaultFilePath = DefaultFilePathPrefix + 0 + "." + VisualBasicDefaultExt; internal static string TestProjectName = "TestProject"; #region Get Diagnostics /// /// 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. /// /// Classes in the form of strings /// The language the source classes are in /// The analyzer to be run on the sources /// An IEnumerable of Diagnostics that surfaced in the source code, sorted by Location private static Diagnostic[] GetSortedDiagnostics(string[] sources, string language, DiagnosticAnalyzer analyzer) => GetSortedDiagnosticsFromDocuments(analyzer, GetDocuments(sources, language)); /// /// Given an analyzer and a document to apply it to, run the analyzer and gather an array of diagnostics found in it. /// The returned diagnostics are then ordered by location in the source document. /// /// The analyzer to run on the documents /// The Documents that the analyzer will be run on /// Optional TextSpan indicating where a Diagnostic will be found /// An IEnumerable of Diagnostics that surfaced in the source code, sorted by Location protected static Diagnostic[] GetSortedDiagnosticsFromDocuments(DiagnosticAnalyzer analyzer, Document[] documents) { var projects = new HashSet(); foreach (var document in documents) { projects.Add(document.Project); } var diagnostics = new List(); foreach (var project in projects) { var compilationWithAnalyzers = project.GetCompilationAsync().Result.WithAnalyzers(ImmutableArray.Create(analyzer)); var diags = compilationWithAnalyzers.GetAnalyzerDiagnosticsAsync().Result; foreach (var diag in diags) { if (diag.Location == Location.None || diag.Location.IsInMetadata) { diagnostics.Add(diag); } else { for (int i = 0; i < documents.Length; i++) { var document = documents[i]; var tree = document.GetSyntaxTreeAsync().Result; if (tree == diag.Location.SourceTree) { diagnostics.Add(diag); } } } } } var results = SortDiagnostics(diagnostics); diagnostics.Clear(); return results; } /// /// Sort diagnostics by location in source document /// /// The list of Diagnostics to be sorted /// An IEnumerable containing the Diagnostics in order of Location private static Diagnostic[] SortDiagnostics(IEnumerable diagnostics) => diagnostics.OrderBy(d => d.Location.SourceSpan.Start).ToArray(); #endregion #region Set up compilation and documents /// /// Given an array of strings as sources and a language, turn them into a project and return the documents and spans of it. /// /// Classes in the form of strings /// The language the source code is in /// A Tuple containing the Documents produced from the sources and their TextSpans if relevant private static Document[] GetDocuments(string[] sources, string language) { if (language != LanguageNames.CSharp && language != LanguageNames.VisualBasic) { throw new ArgumentException("Unsupported Language"); } for (int i = 0; i < sources.Length; i++) { string fileName = language == LanguageNames.CSharp ? "Test" + i + ".cs" : "Test" + i + ".vb"; } var project = CreateProject(sources, language); var documents = project.Documents.ToArray(); if (sources.Length != documents.Length) { throw new SystemException("Amount of sources did not match amount of Documents created"); } return documents; } /// /// Create a Document from a string through creating a project that contains it. /// /// Classes in the form of a string /// The language the source code is in /// A Document created from the source string protected static Document CreateDocument(string source, string language = LanguageNames.CSharp) => CreateProject(new[] { source }, language).Documents.First(); /// /// Create a project using the inputted strings as sources. /// /// Classes in the form of strings /// The language the source code is in /// A Project created out of the Documents created from the source strings private static Project CreateProject(string[] sources, string language = LanguageNames.CSharp) { string fileNamePrefix = DefaultFilePathPrefix; string fileExt = language == LanguageNames.CSharp ? CSharpDefaultFileExt : VisualBasicDefaultExt; var projectId = ProjectId.CreateNewId(debugName: TestProjectName); var solution = new AdhocWorkspace() .CurrentSolution .AddProject(projectId, TestProjectName, TestProjectName, language) .AddMetadataReference(projectId, CorlibReference) .AddMetadataReference(projectId, SystemCoreReference) .AddMetadataReference(projectId, CSharpSymbolsReference) .AddMetadataReference(projectId, CodeAnalysisReference) .AddMetadataReference(projectId, FluentArithmeticReference); int count = 0; foreach (var source in sources) { var newFileName = fileNamePrefix + count + "." + fileExt; var documentId = DocumentId.CreateNewId(projectId, debugName: newFileName); solution = solution.AddDocument(documentId, newFileName, SourceText.From(source)); count++; } return solution.GetProject(projectId); } #endregion } } ================================================ FILE: Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer.Test/LiteralUnitTest.cs ================================================ using FluentArithmeticAnalyzer.Literal; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CodeFixes; using Microsoft.CodeAnalysis.Diagnostics; using Microsoft.VisualStudio.TestTools.UnitTesting; using TestHelper; namespace FluentArithmeticAnalyzer.Test { [TestClass] public class LiteralUnitTest : CodeFixVerifier { [TestMethod] public void TestMethod1() { var test = @"using System; using FluentArithmetic; class Program { static void Main(string[] args) { var x = 1.Add(2).Mul(3).Sub(1).Div(4); Console.WriteLine(x); } } "; var expected = new DiagnosticResult { Id = LiteralAnalyzer.DiagnosticId, Message = string.Format(LiteralAnalyzer.MessageFormat.ToString(), "Add"), Severity = DiagnosticSeverity.Info, Locations = new[] { new DiagnosticResultLocation("Test0.cs", 8, 17) } }; VerifyCSharpDiagnostic(test, expected); var newSource = @"using System; using FluentArithmetic; class Program { static void Main(string[] args) { var x = 3.Mul(3).Sub(1).Div(4); Console.WriteLine(x); } } "; VerifyCSharpFix(test, newSource); } [TestMethod] public void TestMethod2() { var test = @"using System; using FluentArithmetic; class Program { static void Main(string[] args) { var x = 1.Div(0).Mul(3).Sub(1).Div(4); Console.WriteLine(x); } } "; VerifyCSharpDiagnostic(test); } protected override CodeFixProvider GetCSharpCodeFixProvider() => new LiteralFix(); protected override DiagnosticAnalyzer GetCSharpDiagnosticAnalyzer() => new LiteralAnalyzer(); } } ================================================ FILE: Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer.Test/Properties/AssemblyInfo.cs ================================================ using System.Reflection; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("FluentArithmeticAnalyzer.Test")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("FluentArithmeticAnalyzer.Test")] [assembly: AssemblyCopyright("Copyright © 2015")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] ================================================ FILE: Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer.Test/Verifiers/CodeFixVerifier.cs ================================================ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CodeActions; using Microsoft.CodeAnalysis.CodeFixes; using Microsoft.CodeAnalysis.Diagnostics; using Microsoft.CodeAnalysis.Formatting; using Microsoft.VisualStudio.TestTools.UnitTesting; using System.Collections.Generic; using System.Linq; using System.Threading; namespace TestHelper { /// /// Superclass of all Unit tests made for diagnostics with codefixes. /// Contains methods used to verify correctness of codefixes /// public abstract partial class CodeFixVerifier : DiagnosticVerifier { /// /// Returns the codefix being tested (C#) - to be implemented in non-abstract class /// /// The CodeFixProvider to be used for CSharp code protected virtual CodeFixProvider GetCSharpCodeFixProvider() => null; /// /// Returns the codefix being tested (VB) - to be implemented in non-abstract class /// /// The CodeFixProvider to be used for VisualBasic code protected virtual CodeFixProvider GetBasicCodeFixProvider() => null; /// /// Called to test a C# codefix when applied on the inputted string as a source /// /// A class in the form of a string before the CodeFix was applied to it /// A class in the form of a string after the CodeFix was applied to it /// Index determining which codefix to apply if there are multiple /// A bool controlling whether or not the test will fail if the CodeFix introduces other warnings after being applied protected void VerifyCSharpFix(string oldSource, string newSource, int? codeFixIndex = null, bool allowNewCompilerDiagnostics = false) { VerifyFix(LanguageNames.CSharp, GetCSharpDiagnosticAnalyzer(), GetCSharpCodeFixProvider(), oldSource, newSource, codeFixIndex, allowNewCompilerDiagnostics); } /// /// Called to test a VB codefix when applied on the inputted string as a source /// /// A class in the form of a string before the CodeFix was applied to it /// A class in the form of a string after the CodeFix was applied to it /// Index determining which codefix to apply if there are multiple /// A bool controlling whether or not the test will fail if the CodeFix introduces other warnings after being applied protected void VerifyBasicFix(string oldSource, string newSource, int? codeFixIndex = null, bool allowNewCompilerDiagnostics = false) { VerifyFix(LanguageNames.VisualBasic, GetBasicDiagnosticAnalyzer(), GetBasicCodeFixProvider(), oldSource, newSource, codeFixIndex, allowNewCompilerDiagnostics); } /// /// General verifier for codefixes. /// Creates a Document from the source string, then gets diagnostics on it and applies the relevant codefixes. /// Then gets the string after the codefix is applied and compares it with the expected result. /// Note: If any codefix causes new diagnostics to show up, the test fails unless allowNewCompilerDiagnostics is set to true. /// /// The language the source code is in /// The analyzer to be applied to the source code /// The codefix to be applied to the code wherever the relevant Diagnostic is found /// A class in the form of a string before the CodeFix was applied to it /// A class in the form of a string after the CodeFix was applied to it /// Index determining which codefix to apply if there are multiple /// A bool controlling whether or not the test will fail if the CodeFix introduces other warnings after being applied private void VerifyFix(string language, DiagnosticAnalyzer analyzer, CodeFixProvider codeFixProvider, string oldSource, string newSource, int? codeFixIndex, bool allowNewCompilerDiagnostics) { var document = CreateDocument(oldSource, language); var analyzerDiagnostics = GetSortedDiagnosticsFromDocuments(analyzer, new[] { document }); var compilerDiagnostics = GetCompilerDiagnostics(document); var attempts = analyzerDiagnostics.Length; for (int i = 0; i < attempts; ++i) { var actions = new List(); var context = new CodeFixContext(document, analyzerDiagnostics[0], (a, d) => actions.Add(a), CancellationToken.None); codeFixProvider.RegisterCodeFixesAsync(context).Wait(); if (!actions.Any()) { break; } if (codeFixIndex != null) { document = ApplyFix(document, actions.ElementAt((int)codeFixIndex)); break; } document = ApplyFix(document, actions.ElementAt(0)); analyzerDiagnostics = GetSortedDiagnosticsFromDocuments(analyzer, new[] { document }); var newCompilerDiagnostics = GetNewDiagnostics(compilerDiagnostics, GetCompilerDiagnostics(document)); //check if applying the code fix introduced any new compiler diagnostics if (!allowNewCompilerDiagnostics && newCompilerDiagnostics.Any()) { // Format and get the compiler diagnostics again so that the locations make sense in the output document = document.WithSyntaxRoot(Formatter.Format(document.GetSyntaxRootAsync().Result, Formatter.Annotation, document.Project.Solution.Workspace)); newCompilerDiagnostics = GetNewDiagnostics(compilerDiagnostics, GetCompilerDiagnostics(document)); Assert.IsTrue(false, string.Format("Fix introduced new compiler diagnostics:\r\n{0}\r\n\r\nNew document:\r\n{1}\r\n", string.Join("\r\n", newCompilerDiagnostics.Select(d => d.ToString())), document.GetSyntaxRootAsync().Result.ToFullString())); } //check if there are analyzer diagnostics left after the code fix if (!analyzerDiagnostics.Any()) { break; } } //after applying all of the code fixes, compare the resulting string to the inputted one var actual = GetStringFromDocument(document); Assert.AreEqual(newSource, actual); } } } ================================================ FILE: Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer.Test/Verifiers/DiagnosticVerifier.cs ================================================ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.Diagnostics; using Microsoft.VisualStudio.TestTools.UnitTesting; using System.Collections.Generic; using System.Linq; using System.Text; namespace TestHelper { /// /// Superclass of all Unit Tests for DiagnosticAnalyzers /// public abstract partial class DiagnosticVerifier { #region To be implemented by Test classes /// /// Get the CSharp analyzer being tested - to be implemented in non-abstract class /// protected virtual DiagnosticAnalyzer GetCSharpDiagnosticAnalyzer() => null; /// /// Get the Visual Basic analyzer being tested (C#) - to be implemented in non-abstract class /// protected virtual DiagnosticAnalyzer GetBasicDiagnosticAnalyzer() => null; #endregion #region Verifier wrappers /// /// Called to test a C# DiagnosticAnalyzer when applied on the single inputted string as a source /// Note: input a DiagnosticResult for each Diagnostic expected /// /// A class in the form of a string to run the analyzer on /// DiagnosticResults that should appear after the analyzer is run on the source protected void VerifyCSharpDiagnostic(string source, params DiagnosticResult[] expected) { VerifyDiagnostics(new[] { source }, LanguageNames.CSharp, GetCSharpDiagnosticAnalyzer(), expected); } /// /// Called to test a VB DiagnosticAnalyzer when applied on the single inputted string as a source /// Note: input a DiagnosticResult for each Diagnostic expected /// /// A class in the form of a string to run the analyzer on /// DiagnosticResults that should appear after the analyzer is run on the source protected void VerifyBasicDiagnostic(string source, params DiagnosticResult[] expected) { VerifyDiagnostics(new[] { source }, LanguageNames.VisualBasic, GetBasicDiagnosticAnalyzer(), expected); } /// /// Called to test a C# DiagnosticAnalyzer when applied on the inputted strings as a source /// Note: input a DiagnosticResult for each Diagnostic expected /// /// An array of strings to create source documents from to run the analyzers on /// DiagnosticResults that should appear after the analyzer is run on the sources protected void VerifyCSharpDiagnostic(string[] sources, params DiagnosticResult[] expected) { VerifyDiagnostics(sources, LanguageNames.CSharp, GetCSharpDiagnosticAnalyzer(), expected); } /// /// Called to test a VB DiagnosticAnalyzer when applied on the inputted strings as a source /// Note: input a DiagnosticResult for each Diagnostic expected /// /// An array of strings to create source documents from to run the analyzers on /// DiagnosticResults that should appear after the analyzer is run on the sources protected void VerifyBasicDiagnostic(string[] sources, params DiagnosticResult[] expected) { VerifyDiagnostics(sources, LanguageNames.VisualBasic, GetBasicDiagnosticAnalyzer(), expected); } /// /// General method that gets a collection of actual diagnostics found in the source after the analyzer is run, /// then verifies each of them. /// /// An array of strings to create source documents from to run the analyzers on /// The language of the classes represented by the source strings /// The analyzer to be run on the source code /// DiagnosticResults that should appear after the analyzer is run on the sources private void VerifyDiagnostics(string[] sources, string language, DiagnosticAnalyzer analyzer, params DiagnosticResult[] expected) { var diagnostics = GetSortedDiagnostics(sources, language, analyzer); VerifyDiagnosticResults(diagnostics, analyzer, expected); } #endregion #region Actual comparisons and verifications /// /// Checks each of the actual Diagnostics found and compares them with the corresponding DiagnosticResult in the array of expected results. /// Diagnostics are considered equal only if the DiagnosticResultLocation, Id, Severity, and Message of the DiagnosticResult match the actual diagnostic. /// /// The Diagnostics found by the compiler after running the analyzer on the source code /// The analyzer that was being run on the sources /// Diagnostic Results that should have appeared in the code private static void VerifyDiagnosticResults(IEnumerable actualResults, DiagnosticAnalyzer analyzer, params DiagnosticResult[] expectedResults) { int expectedCount = expectedResults.Count(); int actualCount = actualResults.Count(); if (expectedCount != actualCount) { string diagnosticsOutput = actualResults.Any() ? FormatDiagnostics(analyzer, actualResults.ToArray()) : " NONE."; Assert.IsTrue(false, string.Format("Mismatch between number of diagnostics returned, expected \"{0}\" actual \"{1}\"\r\n\r\nDiagnostics:\r\n{2}\r\n", expectedCount, actualCount, diagnosticsOutput)); } for (int i = 0; i < expectedResults.Length; i++) { var actual = actualResults.ElementAt(i); var expected = expectedResults[i]; if (expected.Line == -1 && expected.Column == -1) { if (actual.Location != Location.None) { Assert.IsTrue(false, string.Format("Expected:\nA project diagnostic with No location\nActual:\n{0}", FormatDiagnostics(analyzer, actual))); } } else { VerifyDiagnosticLocation(analyzer, actual, actual.Location, expected.Locations.First()); var additionalLocations = actual.AdditionalLocations.ToArray(); if (additionalLocations.Length != expected.Locations.Length - 1) { Assert.IsTrue(false, string.Format("Expected {0} additional locations but got {1} for Diagnostic:\r\n {2}\r\n", expected.Locations.Length - 1, additionalLocations.Length, FormatDiagnostics(analyzer, actual))); } for (int j = 0; j < additionalLocations.Length; ++j) { VerifyDiagnosticLocation(analyzer, actual, additionalLocations[j], expected.Locations[j + 1]); } } if (actual.Id != expected.Id) { Assert.IsTrue(false, string.Format("Expected diagnostic id to be \"{0}\" was \"{1}\"\r\n\r\nDiagnostic:\r\n {2}\r\n", expected.Id, actual.Id, FormatDiagnostics(analyzer, actual))); } if (actual.Severity != expected.Severity) { Assert.IsTrue(false, string.Format("Expected diagnostic severity to be \"{0}\" was \"{1}\"\r\n\r\nDiagnostic:\r\n {2}\r\n", expected.Severity, actual.Severity, FormatDiagnostics(analyzer, actual))); } if (actual.GetMessage() != expected.Message) { Assert.IsTrue(false, string.Format("Expected diagnostic message to be \"{0}\" was \"{1}\"\r\n\r\nDiagnostic:\r\n {2}\r\n", expected.Message, actual.GetMessage(), FormatDiagnostics(analyzer, actual))); } } } /// /// Helper method to VerifyDiagnosticResult that checks the location of a diagnostic and compares it with the location in the expected DiagnosticResult. /// /// The analyzer that was being run on the sources /// The diagnostic that was found in the code /// The Location of the Diagnostic found in the code /// The DiagnosticResultLocation that should have been found private static void VerifyDiagnosticLocation(DiagnosticAnalyzer analyzer, Diagnostic diagnostic, Location actual, DiagnosticResultLocation expected) { var actualSpan = actual.GetLineSpan(); Assert.IsTrue(actualSpan.Path == expected.Path || (actualSpan.Path != null && actualSpan.Path.Contains("Test0.") && expected.Path.Contains("Test.")), string.Format("Expected diagnostic to be in file \"{0}\" was actually in file \"{1}\"\r\n\r\nDiagnostic:\r\n {2}\r\n", expected.Path, actualSpan.Path, FormatDiagnostics(analyzer, diagnostic))); var actualLinePosition = actualSpan.StartLinePosition; // Only check line position if there is an actual line in the real diagnostic if (actualLinePosition.Line > 0) { if (actualLinePosition.Line + 1 != expected.Line) { Assert.IsTrue(false, string.Format("Expected diagnostic to be on line \"{0}\" was actually on line \"{1}\"\r\n\r\nDiagnostic:\r\n {2}\r\n", expected.Line, actualLinePosition.Line + 1, FormatDiagnostics(analyzer, diagnostic))); } } // Only check column position if there is an actual column position in the real diagnostic if (actualLinePosition.Character > 0) { if (actualLinePosition.Character + 1 != expected.Column) { Assert.IsTrue(false, string.Format("Expected diagnostic to start at column \"{0}\" was actually at column \"{1}\"\r\n\r\nDiagnostic:\r\n {2}\r\n", expected.Column, actualLinePosition.Character + 1, FormatDiagnostics(analyzer, diagnostic))); } } } #endregion #region Formatting Diagnostics /// /// Helper method to format a Diagnostic into an easily readable string /// /// The analyzer that this verifier tests /// The Diagnostics to be formatted /// The Diagnostics formatted as a string private static string FormatDiagnostics(DiagnosticAnalyzer analyzer, params Diagnostic[] diagnostics) { var builder = new StringBuilder(); for (int i = 0; i < diagnostics.Length; ++i) { builder.AppendLine("// " + diagnostics[i].ToString()); var analyzerType = analyzer.GetType(); var rules = analyzer.SupportedDiagnostics; foreach (var rule in rules) { if (rule != null && rule.Id == diagnostics[i].Id) { var location = diagnostics[i].Location; if (location == Location.None) { builder.AppendFormat("GetGlobalResult({0}.{1})", analyzerType.Name, rule.Id); } else { Assert.IsTrue(location.IsInSource, string.Format("Test base does not currently handle diagnostics in metadata locations. Diagnostic in metadata:\r\n", diagnostics[i])); string resultMethodName = diagnostics[i].Location.SourceTree.FilePath.EndsWith(".cs") ? "GetCSharpResultAt" : "GetBasicResultAt"; var linePosition = diagnostics[i].Location.GetLineSpan().StartLinePosition; builder.AppendFormat("{0}({1}, {2}, {3}.{4})", resultMethodName, linePosition.Line + 1, linePosition.Character + 1, analyzerType.Name, rule.Id); } if (i != diagnostics.Length - 1) { builder.Append(','); } builder.AppendLine(); break; } } } return builder.ToString(); } #endregion } } ================================================ FILE: Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer.Test/app.config ================================================  ================================================ FILE: Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer.Test/packages.config ================================================  ================================================ FILE: Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer.Vsix/FluentArithmeticAnalyzer.Vsix.csproj ================================================  14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) Debug AnyCPU 2.0 {82b43b9b-a64c-4715-b499-d71e9ca2bd60};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} {F56992C4-EA05-4DBA-95E0-2FF1CA329606} Library Properties FluentArithmeticAnalyzer FluentArithmeticAnalyzer v4.6 false false false false false false Roslyn true full false bin\Debug\ DEBUG;TRACE prompt 4 pdbonly true bin\Release\ TRACE prompt 4 Program $(DevEnvDir)devenv.exe /rootsuffix Roslyn Designer {F08AC1C8-AA28-49FB-8D92-FF9BE827E75E} FluentArithmeticAnalyzer ================================================ FILE: Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer.Vsix/source.extension.vsixmanifest ================================================  FluentArithmeticAnalyzer.Vsix This is a sample diagnostic extension for the .NET Compiler Platform ("Roslyn"). ================================================ FILE: Chapters/DevEnv/CodeAwareLibrarySample/build/FluentArithmetic.nuspec ================================================  FluentArithmetic 0.1.0 Arithmetics with Fluent Inteface Nobuyuki Iwanaga Nobuyuki Iwanaga https://github.com/ufcpp/UfcppSample/blob/master/LICENSE https://github.com/ufcpp/UfcppSample/tree/master/DevEnv/CodeAwareLibrarySample false A sample package for a Code-Aware library A sample package for a Code-Aware library. This package includes: - FluentArithmetic: arithmetic operations with fluent interfaces, e.g. x.Add(y). - FluentArithmeticAnalyzer: Some analyzers and code fixes for FluentArithmetic. Update to netstandard1.1. Remove supporting NuGet 2.X. Copyright 2015 Nobuyuki Iwanaga sample ================================================ FILE: Chapters/DevEnv/CodeAwareLibrarySample/build/build.ps1 ================================================ $msbuild = ls 'C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe' . $msbuild ..\CodeAwareLibrarySample.sln /t:rebuild /p:Configuration=Release if (-not (Test-Path bin)) { mkdir bin } cp ..\FluentArithmetic\bin\Release\FluentArithmetic.dll bin cp ..\FluentArithmeticAnalyzer\FluentArithmeticAnalyzer\bin\Release\FluentArithmeticAnalyzer.dll bin .\NuGet.exe pack .\FluentArithmetic.nuspec ================================================ FILE: Chapters/DevEnv/CodeAwareLibrarySample/build/pack.bat ================================================ mkdir bin msbuild .\NuGet.exe pack .\MinimumAsyncBridge.nuspec -NoPackageAnalysis -OutputDirectory . .\NuGet.exe pack .\MinimumThreadingBridge.nuspec -NoPackageAnalysis -OutputDirectory . .\NuGet.exe pack .\MvvmBridge.nuspec -NoPackageAnalysis -OutputDirectory . ================================================ FILE: Chapters/DevEnv/ConsoleApplication1/ConsoleApplication1/App.config ================================================  ================================================ FILE: Chapters/DevEnv/ConsoleApplication1/ConsoleApplication1/ConsoleApplication1.csproj ================================================  Debug AnyCPU {129EE2CB-ED54-43E9-AEFD-91126B3A8AC3} Exe Properties ConsoleApplication1 ConsoleApplication1 v4.6 512 true AnyCPU true full false bin\Debug\ DEBUG;TRACE prompt 4 AnyCPU pdbonly true bin\Release\ TRACE prompt 4 ================================================ FILE: Chapters/DevEnv/ConsoleApplication1/ConsoleApplication1/Logic.cs ================================================ namespace ConsoleApplication1 { class Logic { public int Filter(int x) => x * x; } } ================================================ FILE: Chapters/DevEnv/ConsoleApplication1/ConsoleApplication1/Program.cs ================================================ using System; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { var x = new Logic(); Console.WriteLine(x.Filter(10)); } } } ================================================ FILE: Chapters/DevEnv/ConsoleApplication1/ConsoleApplication1/Properties/AssemblyInfo.cs ================================================ using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // アセンブリに関する一般情報は以下の属性セットをとおして制御されます。 // アセンブリに関連付けられている情報を変更するには、 // これらの属性値を変更してください。 [assembly: AssemblyTitle("ConsoleApplication1")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("ConsoleApplication1")] [assembly: AssemblyCopyright("Copyright © 2015")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから // 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、 // その型の ComVisible 属性を true に設定してください。 [assembly: ComVisible(false)] // 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です [assembly: Guid("129ee2cb-ed54-43e9-aefd-91126b3a8ac3")] // アセンブリのバージョン情報は、以下の 4 つの値で構成されています: // // Major Version // Minor Version // Build Number // Revision // // すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を // 既定値にすることができます: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] ================================================ FILE: Chapters/DevEnv/ConsoleApplication1/ConsoleApplication1.sln ================================================  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 VisualStudioVersion = 14.0.22823.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleApplication1", "ConsoleApplication1\ConsoleApplication1.csproj", "{129EE2CB-ED54-43E9-AEFD-91126B3A8AC3}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {129EE2CB-ED54-43E9-AEFD-91126B3A8AC3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {129EE2CB-ED54-43E9-AEFD-91126B3A8AC3}.Debug|Any CPU.Build.0 = Debug|Any CPU {129EE2CB-ED54-43E9-AEFD-91126B3A8AC3}.Release|Any CPU.ActiveCfg = Release|Any CPU {129EE2CB-ED54-43E9-AEFD-91126B3A8AC3}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal ================================================ FILE: Chapters/DevEnv/Dependency/Game/App/App.csproj ================================================  Debug x86 {FB2EEAD0-2990-4BBB-B61A-1A54965BC678} AppContainerExe Properties App App ja-JP UAP 10.0.10069.0 10.0.10069.0 14 true 512 {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} App_TemporaryKey.pfx true bin\ARM\Debug\ DEBUG;TRACE;NETFX_CORE;WINDOWS_UAP ;2008 full ARM false prompt true bin\ARM\Release\ TRACE;NETFX_CORE;WINDOWS_UAP true ;2008 pdbonly ARM false prompt true true true bin\x64\Debug\ DEBUG;TRACE;NETFX_CORE;WINDOWS_UAP ;2008 full x64 false prompt true bin\x64\Release\ TRACE;NETFX_CORE;WINDOWS_UAP true ;2008 pdbonly x64 false prompt true true true bin\x86\Debug\ DEBUG;TRACE;NETFX_CORE;WINDOWS_UAP ;2008 full x86 false prompt true bin\x86\Release\ TRACE;NETFX_CORE;WINDOWS_UAP true ;2008 pdbonly x86 false prompt true true App.xaml MainPage.xaml Designer MSBuild:Compile Designer MSBuild:Compile Designer ..\packages\Microsoft.ApplicationInsights.0.14.3-build00177\lib\portable-win81+wpa81\Microsoft.ApplicationInsights.dll True ..\packages\Microsoft.ApplicationInsights.WindowsApps.0.14.3-build00177\lib\win81\Microsoft.ApplicationInsights.Extensibility.Windows.dll True ..\packages\Microsoft.ApplicationInsights.PersistenceChannel.0.14.3-build00177\lib\portable-win81+wpa81\Microsoft.ApplicationInsights.PersistenceChannel.dll True ..\packages\System.Numerics.Vectors.4.0.0\lib\win8\System.Numerics.Vectors.dll True ..\packages\System.Numerics.Vectors.4.0.0\lib\win8\System.Numerics.Vectors.WindowsRuntime.dll True 14.0 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}. ================================================ FILE: Chapters/DevEnv/Dependency/Game/App/App.xaml ================================================  ================================================ FILE: Chapters/DevEnv/Dependency/Game/App/App.xaml.cs ================================================ using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.InteropServices.WindowsRuntime; using Windows.ApplicationModel; using Windows.ApplicationModel.Activation; using Windows.Foundation; using Windows.Foundation.Collections; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls.Primitives; using Windows.UI.Xaml.Data; using Windows.UI.Xaml.Input; using Windows.UI.Xaml.Media; using Windows.UI.Xaml.Navigation; // The Blank Application template is documented at http://go.microsoft.com/fwlink/?LinkId=402347&clcid=0x409 namespace App { /// /// Provides application-specific behavior to supplement the default Application class. /// sealed partial class App : Application { /// /// Allows tracking page views, exceptions and other telemetry through the Microsoft Application Insights service. /// public static Microsoft.ApplicationInsights.TelemetryClient TelemetryClient; /// /// Initializes the singleton application object. This is the first line of authored code /// executed, and as such is the logical equivalent of main() or WinMain(). /// public App() { TelemetryClient = new Microsoft.ApplicationInsights.TelemetryClient(); this.InitializeComponent(); this.Suspending += OnSuspending; } /// /// Invoked when the application is launched normally by the end user. Other entry points /// will be used such as when the application is launched to open a specific file. /// /// Details about the launch request and process. protected override void OnLaunched(LaunchActivatedEventArgs e) { #if DEBUG if (System.Diagnostics.Debugger.IsAttached) { this.DebugSettings.EnableFrameRateCounter = true; } #endif Frame rootFrame = Window.Current.Content as Frame; // Do not repeat app initialization when the Window already has content, // just ensure that the window is active if (rootFrame == null) { // Create a Frame to act as the navigation context and navigate to the first page rootFrame = new Frame(); rootFrame.NavigationFailed += OnNavigationFailed; if (e.PreviousExecutionState == ApplicationExecutionState.Terminated) { //TODO: Load state from previously suspended application } // Place the frame in the current Window Window.Current.Content = rootFrame; } if (rootFrame.Content == null) { // When the navigation stack isn't restored navigate to the first page, // configuring the new page by passing required information as a navigation // parameter rootFrame.Navigate(typeof(MainPage), e.Arguments); } // Ensure the current window is active Window.Current.Activate(); } /// /// Invoked when Navigation to a certain page fails /// /// The Frame which failed navigation /// Details about the navigation failure void OnNavigationFailed(object sender, NavigationFailedEventArgs e) { throw new Exception("Failed to load Page " + e.SourcePageType.FullName); } /// /// Invoked when application execution is being suspended. Application state is saved /// without knowing whether the application will be terminated or resumed with the contents /// of memory still intact. /// /// The source of the suspend request. /// Details about the suspend request. private void OnSuspending(object sender, SuspendingEventArgs e) { var deferral = e.SuspendingOperation.GetDeferral(); //TODO: Save application state and stop any background activity deferral.Complete(); } } } ================================================ FILE: Chapters/DevEnv/Dependency/Game/App/ApplicationInsights.config ================================================  ================================================ FILE: Chapters/DevEnv/Dependency/Game/App/MainPage.xaml ================================================  ================================================ FILE: Chapters/DevEnv/Dependency/Game/App/MainPage.xaml.cs ================================================ using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.InteropServices.WindowsRuntime; using Windows.Foundation; using Windows.Foundation.Collections; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls.Primitives; using Windows.UI.Xaml.Data; using Windows.UI.Xaml.Input; using Windows.UI.Xaml.Media; using Windows.UI.Xaml.Navigation; // The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409 namespace App { /// /// An empty page that can be used on its own or navigated to within a Frame. /// public sealed partial class MainPage : Page { public MainPage() { this.InitializeComponent(); } } } ================================================ FILE: Chapters/DevEnv/Dependency/Game/App/Package.appxmanifest ================================================  App Nobuyuki Assets\StoreLogo.png ================================================ FILE: Chapters/DevEnv/Dependency/Game/App/Properties/AssemblyInfo.cs ================================================ using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("App")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("App")] [assembly: AssemblyCopyright("Copyright © 2015")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: ComVisible(false)] ================================================ FILE: Chapters/DevEnv/Dependency/Game/App/Properties/Default.rd.xml ================================================ ================================================ FILE: Chapters/DevEnv/Dependency/Game/App/packages.config ================================================  ================================================ FILE: Chapters/DevEnv/Dependency/Game/ClassLibrary/ClassLibrary.csproj ================================================  Debug AnyCPU {AAB3250E-006D-41AF-821D-697875CA7E5D} Library Properties ClassLibrary ClassLibrary v4.6 512 true full false bin\Debug\ DEBUG;TRACE prompt 4 pdbonly true bin\Release\ TRACE prompt 4 ================================================ FILE: Chapters/DevEnv/Dependency/Game/ClassLibrary/Game.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ClassLibrary { public class Game { } } ================================================ FILE: Chapters/DevEnv/Dependency/Game/ClassLibrary/Properties/AssemblyInfo.cs ================================================ using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // アセンブリに関する一般情報は以下の属性セットをとおして制御されます。 // アセンブリに関連付けられている情報を変更するには、 // これらの属性値を変更してください。 [assembly: AssemblyTitle("ClassLibrary")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("ClassLibrary")] [assembly: AssemblyCopyright("Copyright © 2015")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから // 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、 // その型の ComVisible 属性を true に設定してください。 [assembly: ComVisible(false)] // 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です [assembly: Guid("aab3250e-006d-41af-821d-697875ca7e5d")] // アセンブリのバージョン情報は、以下の 4 つの値で構成されています: // // Major Version // Minor Version // Build Number // Revision // // すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を // 既定値にすることができます: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] ================================================ FILE: Chapters/DevEnv/Dependency/Game/ConsoleApplication/App.config ================================================  ================================================ FILE: Chapters/DevEnv/Dependency/Game/ConsoleApplication/ConsoleApplication.csproj ================================================  Debug AnyCPU {8FCAF69A-08A0-4792-B98C-72C95D846A58} Exe Properties ConsoleApplication ConsoleApplication v4.6 512 true AnyCPU true full false bin\Debug\ DEBUG;TRACE prompt 4 AnyCPU pdbonly true bin\Release\ TRACE prompt 4 ================================================ FILE: Chapters/DevEnv/Dependency/Game/ConsoleApplication/Program.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication { class Program { static void Main(string[] args) { } } } ================================================ FILE: Chapters/DevEnv/Dependency/Game/ConsoleApplication/Properties/AssemblyInfo.cs ================================================ using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // アセンブリに関する一般情報は以下の属性セットをとおして制御されます。 // アセンブリに関連付けられている情報を変更するには、 // これらの属性値を変更してください。 [assembly: AssemblyTitle("ConsoleApplication")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("ConsoleApplication")] [assembly: AssemblyCopyright("Copyright © 2015")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから // 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、 // その型の ComVisible 属性を true に設定してください。 [assembly: ComVisible(false)] // 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です [assembly: Guid("8fcaf69a-08a0-4792-b98c-72c95d846a58")] // アセンブリのバージョン情報は、以下の 4 つの値で構成されています: // // Major Version // Minor Version // Build Number // Revision // // すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を // 既定値にすることができます: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] ================================================ FILE: Chapters/DevEnv/Dependency/Game/Game.sln ================================================  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 VisualStudioVersion = 14.0.22823.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClassLibrary", "ClassLibrary\ClassLibrary.csproj", "{AAB3250E-006D-41AF-821D-697875CA7E5D}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebApplication", "WebApplication\WebApplication.csproj", "{0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfApplication", "WpfApplication\WpfApplication.csproj", "{8234D45B-C840-419A-8CF5-24B3094BA050}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "App", "App\App.csproj", "{FB2EEAD0-2990-4BBB-B61A-1A54965BC678}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleApplication", "ConsoleApplication\ConsoleApplication.csproj", "{8FCAF69A-08A0-4792-B98C-72C95D846A58}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Debug|ARM = Debug|ARM Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU Release|ARM = Release|ARM Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {AAB3250E-006D-41AF-821D-697875CA7E5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AAB3250E-006D-41AF-821D-697875CA7E5D}.Debug|Any CPU.Build.0 = Debug|Any CPU {AAB3250E-006D-41AF-821D-697875CA7E5D}.Debug|ARM.ActiveCfg = Debug|Any CPU {AAB3250E-006D-41AF-821D-697875CA7E5D}.Debug|ARM.Build.0 = Debug|Any CPU {AAB3250E-006D-41AF-821D-697875CA7E5D}.Debug|x64.ActiveCfg = Debug|Any CPU {AAB3250E-006D-41AF-821D-697875CA7E5D}.Debug|x64.Build.0 = Debug|Any CPU {AAB3250E-006D-41AF-821D-697875CA7E5D}.Debug|x86.ActiveCfg = Debug|Any CPU {AAB3250E-006D-41AF-821D-697875CA7E5D}.Debug|x86.Build.0 = Debug|Any CPU {AAB3250E-006D-41AF-821D-697875CA7E5D}.Release|Any CPU.ActiveCfg = Release|Any CPU {AAB3250E-006D-41AF-821D-697875CA7E5D}.Release|Any CPU.Build.0 = Release|Any CPU {AAB3250E-006D-41AF-821D-697875CA7E5D}.Release|ARM.ActiveCfg = Release|Any CPU {AAB3250E-006D-41AF-821D-697875CA7E5D}.Release|ARM.Build.0 = Release|Any CPU {AAB3250E-006D-41AF-821D-697875CA7E5D}.Release|x64.ActiveCfg = Release|Any CPU {AAB3250E-006D-41AF-821D-697875CA7E5D}.Release|x64.Build.0 = Release|Any CPU {AAB3250E-006D-41AF-821D-697875CA7E5D}.Release|x86.ActiveCfg = Release|Any CPU {AAB3250E-006D-41AF-821D-697875CA7E5D}.Release|x86.Build.0 = Release|Any CPU {0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}.Debug|Any CPU.Build.0 = Debug|Any CPU {0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}.Debug|ARM.ActiveCfg = Debug|Any CPU {0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}.Debug|ARM.Build.0 = Debug|Any CPU {0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}.Debug|x64.ActiveCfg = Debug|Any CPU {0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}.Debug|x64.Build.0 = Debug|Any CPU {0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}.Debug|x86.ActiveCfg = Debug|Any CPU {0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}.Debug|x86.Build.0 = Debug|Any CPU {0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}.Release|Any CPU.ActiveCfg = Release|Any CPU {0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}.Release|Any CPU.Build.0 = Release|Any CPU {0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}.Release|ARM.ActiveCfg = Release|Any CPU {0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}.Release|ARM.Build.0 = Release|Any CPU {0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}.Release|x64.ActiveCfg = Release|Any CPU {0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}.Release|x64.Build.0 = Release|Any CPU {0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}.Release|x86.ActiveCfg = Release|Any CPU {0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}.Release|x86.Build.0 = Release|Any CPU {8234D45B-C840-419A-8CF5-24B3094BA050}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8234D45B-C840-419A-8CF5-24B3094BA050}.Debug|Any CPU.Build.0 = Debug|Any CPU {8234D45B-C840-419A-8CF5-24B3094BA050}.Debug|ARM.ActiveCfg = Debug|Any CPU {8234D45B-C840-419A-8CF5-24B3094BA050}.Debug|ARM.Build.0 = Debug|Any CPU {8234D45B-C840-419A-8CF5-24B3094BA050}.Debug|x64.ActiveCfg = Debug|Any CPU {8234D45B-C840-419A-8CF5-24B3094BA050}.Debug|x64.Build.0 = Debug|Any CPU {8234D45B-C840-419A-8CF5-24B3094BA050}.Debug|x86.ActiveCfg = Debug|Any CPU {8234D45B-C840-419A-8CF5-24B3094BA050}.Debug|x86.Build.0 = Debug|Any CPU {8234D45B-C840-419A-8CF5-24B3094BA050}.Release|Any CPU.ActiveCfg = Release|Any CPU {8234D45B-C840-419A-8CF5-24B3094BA050}.Release|Any CPU.Build.0 = Release|Any CPU {8234D45B-C840-419A-8CF5-24B3094BA050}.Release|ARM.ActiveCfg = Release|Any CPU {8234D45B-C840-419A-8CF5-24B3094BA050}.Release|ARM.Build.0 = Release|Any CPU {8234D45B-C840-419A-8CF5-24B3094BA050}.Release|x64.ActiveCfg = Release|Any CPU {8234D45B-C840-419A-8CF5-24B3094BA050}.Release|x64.Build.0 = Release|Any CPU {8234D45B-C840-419A-8CF5-24B3094BA050}.Release|x86.ActiveCfg = Release|Any CPU {8234D45B-C840-419A-8CF5-24B3094BA050}.Release|x86.Build.0 = Release|Any CPU {FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Debug|Any CPU.ActiveCfg = Debug|x86 {FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Debug|ARM.ActiveCfg = Debug|ARM {FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Debug|ARM.Build.0 = Debug|ARM {FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Debug|ARM.Deploy.0 = Debug|ARM {FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Debug|x64.ActiveCfg = Debug|x64 {FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Debug|x64.Build.0 = Debug|x64 {FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Debug|x64.Deploy.0 = Debug|x64 {FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Debug|x86.ActiveCfg = Debug|x86 {FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Debug|x86.Build.0 = Debug|x86 {FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Debug|x86.Deploy.0 = Debug|x86 {FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Release|Any CPU.ActiveCfg = Release|x86 {FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Release|ARM.ActiveCfg = Release|ARM {FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Release|ARM.Build.0 = Release|ARM {FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Release|ARM.Deploy.0 = Release|ARM {FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Release|x64.ActiveCfg = Release|x64 {FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Release|x64.Build.0 = Release|x64 {FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Release|x64.Deploy.0 = Release|x64 {FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Release|x86.ActiveCfg = Release|x86 {FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Release|x86.Build.0 = Release|x86 {FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Release|x86.Deploy.0 = Release|x86 {8FCAF69A-08A0-4792-B98C-72C95D846A58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8FCAF69A-08A0-4792-B98C-72C95D846A58}.Debug|Any CPU.Build.0 = Debug|Any CPU {8FCAF69A-08A0-4792-B98C-72C95D846A58}.Debug|ARM.ActiveCfg = Debug|Any CPU {8FCAF69A-08A0-4792-B98C-72C95D846A58}.Debug|ARM.Build.0 = Debug|Any CPU {8FCAF69A-08A0-4792-B98C-72C95D846A58}.Debug|x64.ActiveCfg = Debug|Any CPU {8FCAF69A-08A0-4792-B98C-72C95D846A58}.Debug|x64.Build.0 = Debug|Any CPU {8FCAF69A-08A0-4792-B98C-72C95D846A58}.Debug|x86.ActiveCfg = Debug|Any CPU {8FCAF69A-08A0-4792-B98C-72C95D846A58}.Debug|x86.Build.0 = Debug|Any CPU {8FCAF69A-08A0-4792-B98C-72C95D846A58}.Release|Any CPU.ActiveCfg = Release|Any CPU {8FCAF69A-08A0-4792-B98C-72C95D846A58}.Release|Any CPU.Build.0 = Release|Any CPU {8FCAF69A-08A0-4792-B98C-72C95D846A58}.Release|ARM.ActiveCfg = Release|Any CPU {8FCAF69A-08A0-4792-B98C-72C95D846A58}.Release|ARM.Build.0 = Release|Any CPU {8FCAF69A-08A0-4792-B98C-72C95D846A58}.Release|x64.ActiveCfg = Release|Any CPU {8FCAF69A-08A0-4792-B98C-72C95D846A58}.Release|x64.Build.0 = Release|Any CPU {8FCAF69A-08A0-4792-B98C-72C95D846A58}.Release|x86.ActiveCfg = Release|Any CPU {8FCAF69A-08A0-4792-B98C-72C95D846A58}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal ================================================ FILE: Chapters/DevEnv/Dependency/Game/WebApplication/App_Start/BundleConfig.cs ================================================ using System.Web; using System.Web.Optimization; namespace WebApplication { public class BundleConfig { // バンドルの詳細については、http://go.microsoft.com/fwlink/?LinkId=301862 を参照してください public static void RegisterBundles(BundleCollection bundles) { bundles.Add(new ScriptBundle("~/bundles/jquery").Include( "~/Scripts/jquery-{version}.js")); bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include( "~/Scripts/jquery.validate*")); // 開発と学習には、Modernizr の開発バージョンを使用します。次に、実稼働の準備が // できたら、http://modernizr.com にあるビルド ツールを使用して、必要なテストのみを選択します。 bundles.Add(new ScriptBundle("~/bundles/modernizr").Include( "~/Scripts/modernizr-*")); bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include( "~/Scripts/bootstrap.js", "~/Scripts/respond.js")); bundles.Add(new StyleBundle("~/Content/css").Include( "~/Content/bootstrap.css", "~/Content/site.css")); } } } ================================================ FILE: Chapters/DevEnv/Dependency/Game/WebApplication/App_Start/FilterConfig.cs ================================================ using System.Web; using System.Web.Mvc; namespace WebApplication { public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); } } } ================================================ FILE: Chapters/DevEnv/Dependency/Game/WebApplication/App_Start/IdentityConfig.cs ================================================ using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; using System.Web; using Microsoft.AspNet.Identity; using Microsoft.AspNet.Identity.EntityFramework; using Microsoft.AspNet.Identity.Owin; using Microsoft.Owin; using Microsoft.Owin.Security; using WebApplication.Models; namespace WebApplication { public class EmailService : IIdentityMessageService { public Task SendAsync(IdentityMessage message) { // 電子メールを送信するには、電子メール サービスをここにプラグインします。 return Task.FromResult(0); } } public class SmsService : IIdentityMessageService { public Task SendAsync(IdentityMessage message) { // テキスト メッセージを送信するための SMS サービスをここにプラグインします。 return Task.FromResult(0); } } // このアプリケーションで使用されるアプリケーション ユーザー マネージャーを設定します。UserManager は ASP.NET Identity の中で定義されており、このアプリケーションで使用されます。 public class ApplicationUserManager : UserManager { public ApplicationUserManager(IUserStore store) : base(store) { } public static ApplicationUserManager Create(IdentityFactoryOptions options, IOwinContext context) { var manager = new ApplicationUserManager(new UserStore(context.Get())); // ユーザー名の検証ロジックを設定します manager.UserValidator = new UserValidator(manager) { AllowOnlyAlphanumericUserNames = false, RequireUniqueEmail = true }; // パスワードの検証ロジックを設定します manager.PasswordValidator = new PasswordValidator { RequiredLength = 6, RequireNonLetterOrDigit = true, RequireDigit = true, RequireLowercase = true, RequireUppercase = true, }; // ユーザー ロックアウトの既定値を設定します。 manager.UserLockoutEnabledByDefault = true; manager.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(5); manager.MaxFailedAccessAttemptsBeforeLockout = 5; // 2 要素認証プロバイダーを登録します。このアプリケーションでは、Phone and Emails をユーザー検証用コード受け取りのステップとして使用します。 // 独自のプロバイダーをプログラミングしてここにプラグインできます。 manager.RegisterTwoFactorProvider("電話コード", new PhoneNumberTokenProvider { MessageFormat = "あなたのセキュリティ コードは {0} です。" }); manager.RegisterTwoFactorProvider("電子メール コード", new EmailTokenProvider { Subject = "セキュリティ コード", BodyFormat = "あなたのセキュリティ コードは {0} です。" }); manager.EmailService = new EmailService(); manager.SmsService = new SmsService(); var dataProtectionProvider = options.DataProtectionProvider; if (dataProtectionProvider != null) { manager.UserTokenProvider = new DataProtectorTokenProvider(dataProtectionProvider.Create("ASP.NET Identity")); } return manager; } } // このアプリケーションで使用されるアプリケーション サインイン マネージャーを構成します。 public class ApplicationSignInManager : SignInManager { public ApplicationSignInManager(ApplicationUserManager userManager, IAuthenticationManager authenticationManager) : base(userManager, authenticationManager) { } public override Task CreateUserIdentityAsync(ApplicationUser user) { return user.GenerateUserIdentityAsync((ApplicationUserManager)UserManager); } public static ApplicationSignInManager Create(IdentityFactoryOptions options, IOwinContext context) { return new ApplicationSignInManager(context.GetUserManager(), context.Authentication); } } } ================================================ FILE: Chapters/DevEnv/Dependency/Game/WebApplication/App_Start/RouteConfig.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; namespace WebApplication { public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } } } ================================================ FILE: Chapters/DevEnv/Dependency/Game/WebApplication/App_Start/Startup.Auth.cs ================================================ using System; using Microsoft.AspNet.Identity; using Microsoft.AspNet.Identity.Owin; using Microsoft.Owin; using Microsoft.Owin.Security.Cookies; using Microsoft.Owin.Security.Google; using Owin; using WebApplication.Models; namespace WebApplication { public partial class Startup { // 認証設定の詳細については、http://go.microsoft.com/fwlink/?LinkId=301864 を参照してください public void ConfigureAuth(IAppBuilder app) { // 1 要求につき 1 インスタンスのみを使用するように DB コンテキスト、ユーザー マネージャー、サインイン マネージャーを構成します。 app.CreatePerOwinContext(ApplicationDbContext.Create); app.CreatePerOwinContext(ApplicationUserManager.Create); app.CreatePerOwinContext(ApplicationSignInManager.Create); // アプリケーションが Cookie を使用して、サインインしたユーザーの情報を格納できるようにします // また、サードパーティのログイン プロバイダーを使用してログインするユーザーに関する情報を、Cookie を使用して一時的に保存できるようにします // サインイン Cookie の設定 app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, LoginPath = new PathString("/Account/Login"), Provider = new CookieAuthenticationProvider { // ユーザーがログインするときにセキュリティ スタンプを検証するように設定します。 // これはセキュリティ機能の 1 つであり、パスワードを変更するときやアカウントに外部ログインを追加するときに使用されます。 OnValidateIdentity = SecurityStampValidator.OnValidateIdentity( validateInterval: TimeSpan.FromMinutes(30), regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) } }); app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); // 2 要素認証プロセスの中で 2 つ目の要素を確認するときにユーザー情報を一時的に保存するように設定します。 app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5)); // 2 つ目のログイン確認要素 (電話や電子メールなど) を記憶するように設定します。 // このオプションをオンにすると、ログイン プロセスの中の確認の第 2 ステップは、ログインに使用されたデバイスに保存されます。 // これは、ログイン時の「このアカウントを記憶する」オプションに似ています。 app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie); // 次の行のコメントを解除して、サード パーティのログイン プロバイダーを使用したログインを有効にします //app.UseMicrosoftAccountAuthentication( // clientId: "", // clientSecret: ""); //app.UseTwitterAuthentication( // consumerKey: "", // consumerSecret: ""); //app.UseFacebookAuthentication( // appId: "", // appSecret: ""); //app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions() //{ // ClientId = "", // ClientSecret = "" //}); } } } ================================================ FILE: Chapters/DevEnv/Dependency/Game/WebApplication/Content/Site.css ================================================ body { padding-top: 50px; padding-bottom: 20px; } /* Set padding to keep content from hitting the edges */ .body-content { padding-left: 15px; padding-right: 15px; } /* Override the default bootstrap behavior where horizontal description lists will truncate terms that are too long to fit in the left column */ .dl-horizontal dt { white-space: normal; } /* Set width on the form input elements since they're 100% wide by default */ input, select, textarea { max-width: 280px; } ================================================ FILE: Chapters/DevEnv/Dependency/Game/WebApplication/Content/bootstrap.css ================================================ /* NUGET: BEGIN LICENSE TEXT * * Microsoft grants you the right to use these script files for the sole * purpose of either: (i) interacting through your browser with the Microsoft * website or online service, subject to the applicable licensing or use * terms; or (ii) using the files as included with a Microsoft product subject * to that product's license terms. Microsoft reserves all other rights to the * files not expressly granted by Microsoft, whether by implication, estoppel * or otherwise. The notices and licenses below are for informational purposes only. * * NUGET: END LICENSE TEXT */ /*! * Bootstrap v3.0.0 * * Copyright 2013 Twitter, Inc * Licensed under the Apache License v2.0 * http://www.apache.org/licenses/LICENSE-2.0 * * Designed and built with all the love in the world by @mdo and @fat. */ /*! normalize.css v2.1.0 | MIT License | git.io/normalize */ article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { display: block; } audio, canvas, video { display: inline-block; } audio:not([controls]) { display: none; height: 0; } [hidden] { display: none; } html { font-family: sans-serif; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; } body { margin: 0; } a:focus { outline: thin dotted; } a:active, a:hover { outline: 0; } h1 { margin: 0.67em 0; font-size: 2em; } abbr[title] { border-bottom: 1px dotted; } b, strong { font-weight: bold; } dfn { font-style: italic; } hr { height: 0; -moz-box-sizing: content-box; box-sizing: content-box; } mark { color: #000; background: #ff0; } code, kbd, pre, samp { font-family: monospace, serif; font-size: 1em; } pre { white-space: pre-wrap; } q { quotes: "\201C" "\201D" "\2018" "\2019"; } small { font-size: 80%; } sub, sup { position: relative; font-size: 75%; line-height: 0; vertical-align: baseline; } sup { top: -0.5em; } sub { bottom: -0.25em; } img { border: 0; } svg:not(:root) { overflow: hidden; } figure { margin: 0; } fieldset { padding: 0.35em 0.625em 0.75em; margin: 0 2px; border: 1px solid #c0c0c0; } legend { padding: 0; border: 0; } button, input, select, textarea { margin: 0; font-family: inherit; font-size: 100%; } button, input { line-height: normal; } button, select { text-transform: none; } button, html input[type="button"], input[type="reset"], input[type="submit"] { cursor: pointer; -webkit-appearance: button; } button[disabled], html input[disabled] { cursor: default; } input[type="checkbox"], input[type="radio"] { padding: 0; box-sizing: border-box; } input[type="search"] { -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; -webkit-appearance: textfield; } input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } button::-moz-focus-inner, input::-moz-focus-inner { padding: 0; border: 0; } textarea { overflow: auto; vertical-align: top; } table { border-collapse: collapse; border-spacing: 0; } @media print { * { color: #000 !important; text-shadow: none !important; background: transparent !important; box-shadow: none !important; } a, a:visited { text-decoration: underline; } a[href]:after { content: " (" attr(href) ")"; } abbr[title]:after { content: " (" attr(title) ")"; } .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; } pre, blockquote { border: 1px solid #999; page-break-inside: avoid; } thead { display: table-header-group; } tr, img { page-break-inside: avoid; } img { max-width: 100% !important; } @page { margin: 2cm .5cm; } p, h2, h3 { orphans: 3; widows: 3; } h2, h3 { page-break-after: avoid; } .navbar { display: none; } .table td, .table th { background-color: #fff !important; } .btn > .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px solid #000; } .table { border-collapse: collapse !important; } .table-bordered th, .table-bordered td { border: 1px solid #ddd !important; } } *, *:before, *:after { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } html { font-size: 62.5%; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } body { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; line-height: 1.428571429; color: #333333; background-color: #ffffff; } input, button, select, textarea { font-family: inherit; font-size: inherit; line-height: inherit; } button, input, select[multiple], textarea { background-image: none; } a { color: #428bca; text-decoration: none; } a:hover, a:focus { color: #2a6496; text-decoration: underline; } a:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } img { vertical-align: middle; } .img-responsive { display: block; height: auto; max-width: 100%; } .img-rounded { border-radius: 6px; } .img-thumbnail { display: inline-block; height: auto; max-width: 100%; padding: 4px; line-height: 1.428571429; background-color: #ffffff; border: 1px solid #dddddd; border-radius: 4px; -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; } .img-circle { border-radius: 50%; } hr { margin-top: 20px; margin-bottom: 20px; border: 0; border-top: 1px solid #eeeeee; } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); border: 0; } p { margin: 0 0 10px; } .lead { margin-bottom: 20px; font-size: 16.099999999999998px; font-weight: 200; line-height: 1.4; } @media (min-width: 768px) { .lead { font-size: 21px; } } small { font-size: 85%; } cite { font-style: normal; } .text-muted { color: #999999; } .text-primary { color: #428bca; } .text-warning { color: #c09853; } .text-danger { color: #b94a48; } .text-success { color: #468847; } .text-info { color: #3a87ad; } .text-left { text-align: left; } .text-right { text-align: right; } .text-center { text-align: center; } h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-weight: 500; line-height: 1.1; } h1 small, h2 small, h3 small, h4 small, h5 small, h6 small, .h1 small, .h2 small, .h3 small, .h4 small, .h5 small, .h6 small { font-weight: normal; line-height: 1; color: #999999; } h1, h2, h3 { margin-top: 20px; margin-bottom: 10px; } h4, h5, h6 { margin-top: 10px; margin-bottom: 10px; } h1, .h1 { font-size: 36px; } h2, .h2 { font-size: 30px; } h3, .h3 { font-size: 24px; } h4, .h4 { font-size: 18px; } h5, .h5 { font-size: 14px; } h6, .h6 { font-size: 12px; } h1 small, .h1 small { font-size: 24px; } h2 small, .h2 small { font-size: 18px; } h3 small, .h3 small, h4 small, .h4 small { font-size: 14px; } .page-header { padding-bottom: 9px; margin: 40px 0 20px; border-bottom: 1px solid #eeeeee; } ul, ol { margin-top: 0; margin-bottom: 10px; } ul ul, ol ul, ul ol, ol ol { margin-bottom: 0; } .list-unstyled { padding-left: 0; list-style: none; } .list-inline { padding-left: 0; list-style: none; } .list-inline > li { display: inline-block; padding-right: 5px; padding-left: 5px; } dl { margin-bottom: 20px; } dt, dd { line-height: 1.428571429; } dt { font-weight: bold; } dd { margin-left: 0; } @media (min-width: 768px) { .dl-horizontal dt { float: left; width: 160px; overflow: hidden; clear: left; text-align: right; text-overflow: ellipsis; white-space: nowrap; } .dl-horizontal dd { margin-left: 180px; } .dl-horizontal dd:before, .dl-horizontal dd:after { display: table; content: " "; } .dl-horizontal dd:after { clear: both; } .dl-horizontal dd:before, .dl-horizontal dd:after { display: table; content: " "; } .dl-horizontal dd:after { clear: both; } } abbr[title], abbr[data-original-title] { cursor: help; border-bottom: 1px dotted #999999; } abbr.initialism { font-size: 90%; text-transform: uppercase; } blockquote { padding: 10px 20px; margin: 0 0 20px; border-left: 5px solid #eeeeee; } blockquote p { font-size: 17.5px; font-weight: 300; line-height: 1.25; } blockquote p:last-child { margin-bottom: 0; } blockquote small { display: block; line-height: 1.428571429; color: #999999; } blockquote small:before { content: '\2014 \00A0'; } blockquote.pull-right { padding-right: 15px; padding-left: 0; border-right: 5px solid #eeeeee; border-left: 0; } blockquote.pull-right p, blockquote.pull-right small { text-align: right; } blockquote.pull-right small:before { content: ''; } blockquote.pull-right small:after { content: '\00A0 \2014'; } q:before, q:after, blockquote:before, blockquote:after { content: ""; } address { display: block; margin-bottom: 20px; font-style: normal; line-height: 1.428571429; } code, pre { font-family: Monaco, Menlo, Consolas, "Courier New", monospace; } code { padding: 2px 4px; font-size: 90%; color: #c7254e; white-space: nowrap; background-color: #f9f2f4; border-radius: 4px; } pre { display: block; padding: 9.5px; margin: 0 0 10px; font-size: 13px; line-height: 1.428571429; color: #333333; word-break: break-all; word-wrap: break-word; background-color: #f5f5f5; border: 1px solid #cccccc; border-radius: 4px; } pre.prettyprint { margin-bottom: 20px; } pre code { padding: 0; font-size: inherit; color: inherit; white-space: pre-wrap; background-color: transparent; border: 0; } .pre-scrollable { max-height: 340px; overflow-y: scroll; } .container { padding-right: 15px; padding-left: 15px; margin-right: auto; margin-left: auto; } .container:before, .container:after { display: table; content: " "; } .container:after { clear: both; } .container:before, .container:after { display: table; content: " "; } .container:after { clear: both; } .row { margin-right: -15px; margin-left: -15px; } .row:before, .row:after { display: table; content: " "; } .row:after { clear: both; } .row:before, .row:after { display: table; content: " "; } .row:after { clear: both; } .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12, .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-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-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 { position: relative; min-height: 1px; padding-right: 15px; padding-left: 15px; } .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11 { float: left; } .col-xs-1 { width: 8.333333333333332%; } .col-xs-2 { width: 16.666666666666664%; } .col-xs-3 { width: 25%; } .col-xs-4 { width: 33.33333333333333%; } .col-xs-5 { width: 41.66666666666667%; } .col-xs-6 { width: 50%; } .col-xs-7 { width: 58.333333333333336%; } .col-xs-8 { width: 66.66666666666666%; } .col-xs-9 { width: 75%; } .col-xs-10 { width: 83.33333333333334%; } .col-xs-11 { width: 91.66666666666666%; } .col-xs-12 { width: 100%; } @media (min-width: 768px) { .container { max-width: 750px; } .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 { float: left; } .col-sm-1 { width: 8.333333333333332%; } .col-sm-2 { width: 16.666666666666664%; } .col-sm-3 { width: 25%; } .col-sm-4 { width: 33.33333333333333%; } .col-sm-5 { width: 41.66666666666667%; } .col-sm-6 { width: 50%; } .col-sm-7 { width: 58.333333333333336%; } .col-sm-8 { width: 66.66666666666666%; } .col-sm-9 { width: 75%; } .col-sm-10 { width: 83.33333333333334%; } .col-sm-11 { width: 91.66666666666666%; } .col-sm-12 { width: 100%; } .col-sm-push-1 { left: 8.333333333333332%; } .col-sm-push-2 { left: 16.666666666666664%; } .col-sm-push-3 { left: 25%; } .col-sm-push-4 { left: 33.33333333333333%; } .col-sm-push-5 { left: 41.66666666666667%; } .col-sm-push-6 { left: 50%; } .col-sm-push-7 { left: 58.333333333333336%; } .col-sm-push-8 { left: 66.66666666666666%; } .col-sm-push-9 { left: 75%; } .col-sm-push-10 { left: 83.33333333333334%; } .col-sm-push-11 { left: 91.66666666666666%; } .col-sm-pull-1 { right: 8.333333333333332%; } .col-sm-pull-2 { right: 16.666666666666664%; } .col-sm-pull-3 { right: 25%; } .col-sm-pull-4 { right: 33.33333333333333%; } .col-sm-pull-5 { right: 41.66666666666667%; } .col-sm-pull-6 { right: 50%; } .col-sm-pull-7 { right: 58.333333333333336%; } .col-sm-pull-8 { right: 66.66666666666666%; } .col-sm-pull-9 { right: 75%; } .col-sm-pull-10 { right: 83.33333333333334%; } .col-sm-pull-11 { right: 91.66666666666666%; } .col-sm-offset-1 { margin-left: 8.333333333333332%; } .col-sm-offset-2 { margin-left: 16.666666666666664%; } .col-sm-offset-3 { margin-left: 25%; } .col-sm-offset-4 { margin-left: 33.33333333333333%; } .col-sm-offset-5 { margin-left: 41.66666666666667%; } .col-sm-offset-6 { margin-left: 50%; } .col-sm-offset-7 { margin-left: 58.333333333333336%; } .col-sm-offset-8 { margin-left: 66.66666666666666%; } .col-sm-offset-9 { margin-left: 75%; } .col-sm-offset-10 { margin-left: 83.33333333333334%; } .col-sm-offset-11 { margin-left: 91.66666666666666%; } } @media (min-width: 992px) { .container { max-width: 970px; } .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 { float: left; } .col-md-1 { width: 8.333333333333332%; } .col-md-2 { width: 16.666666666666664%; } .col-md-3 { width: 25%; } .col-md-4 { width: 33.33333333333333%; } .col-md-5 { width: 41.66666666666667%; } .col-md-6 { width: 50%; } .col-md-7 { width: 58.333333333333336%; } .col-md-8 { width: 66.66666666666666%; } .col-md-9 { width: 75%; } .col-md-10 { width: 83.33333333333334%; } .col-md-11 { width: 91.66666666666666%; } .col-md-12 { width: 100%; } .col-md-push-0 { left: auto; } .col-md-push-1 { left: 8.333333333333332%; } .col-md-push-2 { left: 16.666666666666664%; } .col-md-push-3 { left: 25%; } .col-md-push-4 { left: 33.33333333333333%; } .col-md-push-5 { left: 41.66666666666667%; } .col-md-push-6 { left: 50%; } .col-md-push-7 { left: 58.333333333333336%; } .col-md-push-8 { left: 66.66666666666666%; } .col-md-push-9 { left: 75%; } .col-md-push-10 { left: 83.33333333333334%; } .col-md-push-11 { left: 91.66666666666666%; } .col-md-pull-0 { right: auto; } .col-md-pull-1 { right: 8.333333333333332%; } .col-md-pull-2 { right: 16.666666666666664%; } .col-md-pull-3 { right: 25%; } .col-md-pull-4 { right: 33.33333333333333%; } .col-md-pull-5 { right: 41.66666666666667%; } .col-md-pull-6 { right: 50%; } .col-md-pull-7 { right: 58.333333333333336%; } .col-md-pull-8 { right: 66.66666666666666%; } .col-md-pull-9 { right: 75%; } .col-md-pull-10 { right: 83.33333333333334%; } .col-md-pull-11 { right: 91.66666666666666%; } .col-md-offset-0 { margin-left: 0; } .col-md-offset-1 { margin-left: 8.333333333333332%; } .col-md-offset-2 { margin-left: 16.666666666666664%; } .col-md-offset-3 { margin-left: 25%; } .col-md-offset-4 { margin-left: 33.33333333333333%; } .col-md-offset-5 { margin-left: 41.66666666666667%; } .col-md-offset-6 { margin-left: 50%; } .col-md-offset-7 { margin-left: 58.333333333333336%; } .col-md-offset-8 { margin-left: 66.66666666666666%; } .col-md-offset-9 { margin-left: 75%; } .col-md-offset-10 { margin-left: 83.33333333333334%; } .col-md-offset-11 { margin-left: 91.66666666666666%; } } @media (min-width: 1200px) { .container { max-width: 1170px; } .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 { float: left; } .col-lg-1 { width: 8.333333333333332%; } .col-lg-2 { width: 16.666666666666664%; } .col-lg-3 { width: 25%; } .col-lg-4 { width: 33.33333333333333%; } .col-lg-5 { width: 41.66666666666667%; } .col-lg-6 { width: 50%; } .col-lg-7 { width: 58.333333333333336%; } .col-lg-8 { width: 66.66666666666666%; } .col-lg-9 { width: 75%; } .col-lg-10 { width: 83.33333333333334%; } .col-lg-11 { width: 91.66666666666666%; } .col-lg-12 { width: 100%; } .col-lg-push-0 { left: auto; } .col-lg-push-1 { left: 8.333333333333332%; } .col-lg-push-2 { left: 16.666666666666664%; } .col-lg-push-3 { left: 25%; } .col-lg-push-4 { left: 33.33333333333333%; } .col-lg-push-5 { left: 41.66666666666667%; } .col-lg-push-6 { left: 50%; } .col-lg-push-7 { left: 58.333333333333336%; } .col-lg-push-8 { left: 66.66666666666666%; } .col-lg-push-9 { left: 75%; } .col-lg-push-10 { left: 83.33333333333334%; } .col-lg-push-11 { left: 91.66666666666666%; } .col-lg-pull-0 { right: auto; } .col-lg-pull-1 { right: 8.333333333333332%; } .col-lg-pull-2 { right: 16.666666666666664%; } .col-lg-pull-3 { right: 25%; } .col-lg-pull-4 { right: 33.33333333333333%; } .col-lg-pull-5 { right: 41.66666666666667%; } .col-lg-pull-6 { right: 50%; } .col-lg-pull-7 { right: 58.333333333333336%; } .col-lg-pull-8 { right: 66.66666666666666%; } .col-lg-pull-9 { right: 75%; } .col-lg-pull-10 { right: 83.33333333333334%; } .col-lg-pull-11 { right: 91.66666666666666%; } .col-lg-offset-0 { margin-left: 0; } .col-lg-offset-1 { margin-left: 8.333333333333332%; } .col-lg-offset-2 { margin-left: 16.666666666666664%; } .col-lg-offset-3 { margin-left: 25%; } .col-lg-offset-4 { margin-left: 33.33333333333333%; } .col-lg-offset-5 { margin-left: 41.66666666666667%; } .col-lg-offset-6 { margin-left: 50%; } .col-lg-offset-7 { margin-left: 58.333333333333336%; } .col-lg-offset-8 { margin-left: 66.66666666666666%; } .col-lg-offset-9 { margin-left: 75%; } .col-lg-offset-10 { margin-left: 83.33333333333334%; } .col-lg-offset-11 { margin-left: 91.66666666666666%; } } table { max-width: 100%; background-color: transparent; } th { text-align: left; } .table { width: 100%; margin-bottom: 20px; } .table thead > tr > th, .table tbody > tr > th, .table tfoot > tr > th, .table thead > tr > td, .table tbody > tr > td, .table tfoot > tr > td { padding: 8px; line-height: 1.428571429; vertical-align: top; border-top: 1px solid #dddddd; } .table thead > tr > th { vertical-align: bottom; border-bottom: 2px solid #dddddd; } .table caption + thead tr:first-child th, .table colgroup + thead tr:first-child th, .table thead:first-child tr:first-child th, .table caption + thead tr:first-child td, .table colgroup + thead tr:first-child td, .table thead:first-child tr:first-child td { border-top: 0; } .table tbody + tbody { border-top: 2px solid #dddddd; } .table .table { background-color: #ffffff; } .table-condensed thead > tr > th, .table-condensed tbody > tr > th, .table-condensed tfoot > tr > th, .table-condensed thead > tr > td, .table-condensed tbody > tr > td, .table-condensed tfoot > tr > td { padding: 5px; } .table-bordered { border: 1px solid #dddddd; } .table-bordered > thead > tr > th, .table-bordered > tbody > tr > th, .table-bordered > tfoot > tr > th, .table-bordered > thead > tr > td, .table-bordered > tbody > tr > td, .table-bordered > tfoot > tr > td { border: 1px solid #dddddd; } .table-bordered > thead > tr > th, .table-bordered > thead > tr > td { border-bottom-width: 2px; } .table-striped > tbody > tr:nth-child(odd) > td, .table-striped > tbody > tr:nth-child(odd) > th { background-color: #f9f9f9; } .table-hover > tbody > tr:hover > td, .table-hover > tbody > tr:hover > th { background-color: #f5f5f5; } table col[class*="col-"] { display: table-column; float: none; } table td[class*="col-"], table th[class*="col-"] { display: table-cell; float: none; } .table > thead > tr > td.active, .table > tbody > tr > td.active, .table > tfoot > tr > td.active, .table > thead > tr > th.active, .table > tbody > tr > th.active, .table > tfoot > tr > th.active, .table > thead > tr.active > td, .table > tbody > tr.active > td, .table > tfoot > tr.active > td, .table > thead > tr.active > th, .table > tbody > tr.active > th, .table > tfoot > tr.active > th { background-color: #f5f5f5; } .table > thead > tr > td.success, .table > tbody > tr > td.success, .table > tfoot > tr > td.success, .table > thead > tr > th.success, .table > tbody > tr > th.success, .table > tfoot > tr > th.success, .table > thead > tr.success > td, .table > tbody > tr.success > td, .table > tfoot > tr.success > td, .table > thead > tr.success > th, .table > tbody > tr.success > th, .table > tfoot > tr.success > th { background-color: #dff0d8; border-color: #d6e9c6; } .table-hover > tbody > tr > td.success:hover, .table-hover > tbody > tr > th.success:hover, .table-hover > tbody > tr.success:hover > td { background-color: #d0e9c6; border-color: #c9e2b3; } .table > thead > tr > td.danger, .table > tbody > tr > td.danger, .table > tfoot > tr > td.danger, .table > thead > tr > th.danger, .table > tbody > tr > th.danger, .table > tfoot > tr > th.danger, .table > thead > tr.danger > td, .table > tbody > tr.danger > td, .table > tfoot > tr.danger > td, .table > thead > tr.danger > th, .table > tbody > tr.danger > th, .table > tfoot > tr.danger > th { background-color: #f2dede; border-color: #eed3d7; } .table-hover > tbody > tr > td.danger:hover, .table-hover > tbody > tr > th.danger:hover, .table-hover > tbody > tr.danger:hover > td { background-color: #ebcccc; border-color: #e6c1c7; } .table > thead > tr > td.warning, .table > tbody > tr > td.warning, .table > tfoot > tr > td.warning, .table > thead > tr > th.warning, .table > tbody > tr > th.warning, .table > tfoot > tr > th.warning, .table > thead > tr.warning > td, .table > tbody > tr.warning > td, .table > tfoot > tr.warning > td, .table > thead > tr.warning > th, .table > tbody > tr.warning > th, .table > tfoot > tr.warning > th { background-color: #fcf8e3; border-color: #fbeed5; } .table-hover > tbody > tr > td.warning:hover, .table-hover > tbody > tr > th.warning:hover, .table-hover > tbody > tr.warning:hover > td { background-color: #faf2cc; border-color: #f8e5be; } @media (max-width: 768px) { .table-responsive { width: 100%; margin-bottom: 15px; overflow-x: scroll; overflow-y: hidden; border: 1px solid #dddddd; } .table-responsive > .table { margin-bottom: 0; background-color: #fff; } .table-responsive > .table > thead > tr > th, .table-responsive > .table > tbody > tr > th, .table-responsive > .table > tfoot > tr > th, .table-responsive > .table > thead > tr > td, .table-responsive > .table > tbody > tr > td, .table-responsive > .table > tfoot > tr > td { white-space: nowrap; } .table-responsive > .table-bordered { border: 0; } .table-responsive > .table-bordered > thead > tr > th:first-child, .table-responsive > .table-bordered > tbody > tr > th:first-child, .table-responsive > .table-bordered > tfoot > tr > th:first-child, .table-responsive > .table-bordered > thead > tr > td:first-child, .table-responsive > .table-bordered > tbody > tr > td:first-child, .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .table-responsive > .table-bordered > thead > tr > th:last-child, .table-responsive > .table-bordered > tbody > tr > th:last-child, .table-responsive > .table-bordered > tfoot > tr > th:last-child, .table-responsive > .table-bordered > thead > tr > td:last-child, .table-responsive > .table-bordered > tbody > tr > td:last-child, .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .table-responsive > .table-bordered > thead > tr:last-child > th, .table-responsive > .table-bordered > tbody > tr:last-child > th, .table-responsive > .table-bordered > tfoot > tr:last-child > th, .table-responsive > .table-bordered > thead > tr:last-child > td, .table-responsive > .table-bordered > tbody > tr:last-child > td, .table-responsive > .table-bordered > tfoot > tr:last-child > td { border-bottom: 0; } } fieldset { padding: 0; margin: 0; border: 0; } legend { display: block; width: 100%; padding: 0; margin-bottom: 20px; font-size: 21px; line-height: inherit; color: #333333; border: 0; border-bottom: 1px solid #e5e5e5; } label { display: inline-block; margin-bottom: 5px; font-weight: bold; } input[type="search"] { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } input[type="radio"], input[type="checkbox"] { margin: 4px 0 0; margin-top: 1px \9; /* IE8-9 */ line-height: normal; } input[type="file"] { display: block; } select[multiple], select[size] { height: auto; } select optgroup { font-family: inherit; font-size: inherit; font-style: inherit; } input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } input[type="number"]::-webkit-outer-spin-button, input[type="number"]::-webkit-inner-spin-button { height: auto; } .form-control:-moz-placeholder { color: #999999; } .form-control::-moz-placeholder { color: #999999; } .form-control:-ms-input-placeholder { color: #999999; } .form-control::-webkit-input-placeholder { color: #999999; } .form-control { display: block; width: 100%; height: 34px; padding: 6px 12px; font-size: 14px; line-height: 1.428571429; color: #555555; vertical-align: middle; background-color: #ffffff; border: 1px solid #cccccc; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; } .form-control:focus { border-color: #66afe9; outline: 0; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); } .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { cursor: not-allowed; background-color: #eeeeee; } textarea.form-control { height: auto; } .form-group { margin-bottom: 15px; } .radio, .checkbox { display: block; min-height: 20px; padding-left: 20px; margin-top: 10px; margin-bottom: 10px; vertical-align: middle; } .radio label, .checkbox label { display: inline; margin-bottom: 0; font-weight: normal; cursor: pointer; } .radio input[type="radio"], .radio-inline input[type="radio"], .checkbox input[type="checkbox"], .checkbox-inline input[type="checkbox"] { float: left; margin-left: -20px; } .radio + .radio, .checkbox + .checkbox { margin-top: -5px; } .radio-inline, .checkbox-inline { display: inline-block; padding-left: 20px; margin-bottom: 0; font-weight: normal; vertical-align: middle; cursor: pointer; } .radio-inline + .radio-inline, .checkbox-inline + .checkbox-inline { margin-top: 0; margin-left: 10px; } input[type="radio"][disabled], input[type="checkbox"][disabled], .radio[disabled], .radio-inline[disabled], .checkbox[disabled], .checkbox-inline[disabled], fieldset[disabled] input[type="radio"], fieldset[disabled] input[type="checkbox"], fieldset[disabled] .radio, fieldset[disabled] .radio-inline, fieldset[disabled] .checkbox, fieldset[disabled] .checkbox-inline { cursor: not-allowed; } .input-sm { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } select.input-sm { height: 30px; line-height: 30px; } textarea.input-sm { height: auto; } .input-lg { height: 45px; padding: 10px 16px; font-size: 18px; line-height: 1.33; border-radius: 6px; } select.input-lg { height: 45px; line-height: 45px; } textarea.input-lg { height: auto; } .has-warning .help-block, .has-warning .control-label { color: #c09853; } .has-warning .form-control { border-color: #c09853; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-warning .form-control:focus { border-color: #a47e3c; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; } .has-warning .input-group-addon { color: #c09853; background-color: #fcf8e3; border-color: #c09853; } .has-error .help-block, .has-error .control-label { color: #b94a48; } .has-error .form-control { border-color: #b94a48; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-error .form-control:focus { border-color: #953b39; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; } .has-error .input-group-addon { color: #b94a48; background-color: #f2dede; border-color: #b94a48; } .has-success .help-block, .has-success .control-label { color: #468847; } .has-success .form-control { border-color: #468847; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-success .form-control:focus { border-color: #356635; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; } .has-success .input-group-addon { color: #468847; background-color: #dff0d8; border-color: #468847; } .form-control-static { padding-top: 7px; margin-bottom: 0; } .help-block { display: block; margin-top: 5px; margin-bottom: 10px; color: #737373; } @media (min-width: 768px) { .form-inline .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .form-inline .form-control { display: inline-block; } .form-inline .radio, .form-inline .checkbox { display: inline-block; padding-left: 0; margin-top: 0; margin-bottom: 0; } .form-inline .radio input[type="radio"], .form-inline .checkbox input[type="checkbox"] { float: none; margin-left: 0; } } .form-horizontal .control-label, .form-horizontal .radio, .form-horizontal .checkbox, .form-horizontal .radio-inline, .form-horizontal .checkbox-inline { padding-top: 7px; margin-top: 0; margin-bottom: 0; } .form-horizontal .form-group { margin-right: -15px; margin-left: -15px; } .form-horizontal .form-group:before, .form-horizontal .form-group:after { display: table; content: " "; } .form-horizontal .form-group:after { clear: both; } .form-horizontal .form-group:before, .form-horizontal .form-group:after { display: table; content: " "; } .form-horizontal .form-group:after { clear: both; } @media (min-width: 768px) { .form-horizontal .control-label { text-align: right; } } .btn { display: inline-block; padding: 6px 12px; margin-bottom: 0; font-size: 14px; font-weight: normal; line-height: 1.428571429; text-align: center; white-space: nowrap; vertical-align: middle; cursor: pointer; border: 1px solid transparent; border-radius: 4px; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; -o-user-select: none; user-select: none; } .btn:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } .btn:hover, .btn:focus { color: #333333; text-decoration: none; } .btn:active, .btn.active { background-image: none; outline: 0; -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn.disabled, .btn[disabled], fieldset[disabled] .btn { pointer-events: none; cursor: not-allowed; opacity: 0.65; filter: alpha(opacity=65); -webkit-box-shadow: none; box-shadow: none; } .btn-default { color: #333333; background-color: #ffffff; border-color: #cccccc; } .btn-default:hover, .btn-default:focus, .btn-default:active, .btn-default.active, .open .dropdown-toggle.btn-default { color: #333333; background-color: #ebebeb; border-color: #adadad; } .btn-default:active, .btn-default.active, .open .dropdown-toggle.btn-default { background-image: none; } .btn-default.disabled, .btn-default[disabled], fieldset[disabled] .btn-default, .btn-default.disabled:hover, .btn-default[disabled]:hover, fieldset[disabled] .btn-default:hover, .btn-default.disabled:focus, .btn-default[disabled]:focus, fieldset[disabled] .btn-default:focus, .btn-default.disabled:active, .btn-default[disabled]:active, fieldset[disabled] .btn-default:active, .btn-default.disabled.active, .btn-default[disabled].active, fieldset[disabled] .btn-default.active { background-color: #ffffff; border-color: #cccccc; } .btn-primary { color: #ffffff; background-color: #428bca; border-color: #357ebd; } .btn-primary:hover, .btn-primary:focus, .btn-primary:active, .btn-primary.active, .open .dropdown-toggle.btn-primary { color: #ffffff; background-color: #3276b1; border-color: #285e8e; } .btn-primary:active, .btn-primary.active, .open .dropdown-toggle.btn-primary { background-image: none; } .btn-primary.disabled, .btn-primary[disabled], fieldset[disabled] .btn-primary, .btn-primary.disabled:hover, .btn-primary[disabled]:hover, fieldset[disabled] .btn-primary:hover, .btn-primary.disabled:focus, .btn-primary[disabled]:focus, fieldset[disabled] .btn-primary:focus, .btn-primary.disabled:active, .btn-primary[disabled]:active, fieldset[disabled] .btn-primary:active, .btn-primary.disabled.active, .btn-primary[disabled].active, fieldset[disabled] .btn-primary.active { background-color: #428bca; border-color: #357ebd; } .btn-warning { color: #ffffff; background-color: #f0ad4e; border-color: #eea236; } .btn-warning:hover, .btn-warning:focus, .btn-warning:active, .btn-warning.active, .open .dropdown-toggle.btn-warning { color: #ffffff; background-color: #ed9c28; border-color: #d58512; } .btn-warning:active, .btn-warning.active, .open .dropdown-toggle.btn-warning { background-image: none; } .btn-warning.disabled, .btn-warning[disabled], fieldset[disabled] .btn-warning, .btn-warning.disabled:hover, .btn-warning[disabled]:hover, fieldset[disabled] .btn-warning:hover, .btn-warning.disabled:focus, .btn-warning[disabled]:focus, fieldset[disabled] .btn-warning:focus, .btn-warning.disabled:active, .btn-warning[disabled]:active, fieldset[disabled] .btn-warning:active, .btn-warning.disabled.active, .btn-warning[disabled].active, fieldset[disabled] .btn-warning.active { background-color: #f0ad4e; border-color: #eea236; } .btn-danger { color: #ffffff; background-color: #d9534f; border-color: #d43f3a; } .btn-danger:hover, .btn-danger:focus, .btn-danger:active, .btn-danger.active, .open .dropdown-toggle.btn-danger { color: #ffffff; background-color: #d2322d; border-color: #ac2925; } .btn-danger:active, .btn-danger.active, .open .dropdown-toggle.btn-danger { background-image: none; } .btn-danger.disabled, .btn-danger[disabled], fieldset[disabled] .btn-danger, .btn-danger.disabled:hover, .btn-danger[disabled]:hover, fieldset[disabled] .btn-danger:hover, .btn-danger.disabled:focus, .btn-danger[disabled]:focus, fieldset[disabled] .btn-danger:focus, .btn-danger.disabled:active, .btn-danger[disabled]:active, fieldset[disabled] .btn-danger:active, .btn-danger.disabled.active, .btn-danger[disabled].active, fieldset[disabled] .btn-danger.active { background-color: #d9534f; border-color: #d43f3a; } .btn-success { color: #ffffff; background-color: #5cb85c; border-color: #4cae4c; } .btn-success:hover, .btn-success:focus, .btn-success:active, .btn-success.active, .open .dropdown-toggle.btn-success { color: #ffffff; background-color: #47a447; border-color: #398439; } .btn-success:active, .btn-success.active, .open .dropdown-toggle.btn-success { background-image: none; } .btn-success.disabled, .btn-success[disabled], fieldset[disabled] .btn-success, .btn-success.disabled:hover, .btn-success[disabled]:hover, fieldset[disabled] .btn-success:hover, .btn-success.disabled:focus, .btn-success[disabled]:focus, fieldset[disabled] .btn-success:focus, .btn-success.disabled:active, .btn-success[disabled]:active, fieldset[disabled] .btn-success:active, .btn-success.disabled.active, .btn-success[disabled].active, fieldset[disabled] .btn-success.active { background-color: #5cb85c; border-color: #4cae4c; } .btn-info { color: #ffffff; background-color: #5bc0de; border-color: #46b8da; } .btn-info:hover, .btn-info:focus, .btn-info:active, .btn-info.active, .open .dropdown-toggle.btn-info { color: #ffffff; background-color: #39b3d7; border-color: #269abc; } .btn-info:active, .btn-info.active, .open .dropdown-toggle.btn-info { background-image: none; } .btn-info.disabled, .btn-info[disabled], fieldset[disabled] .btn-info, .btn-info.disabled:hover, .btn-info[disabled]:hover, fieldset[disabled] .btn-info:hover, .btn-info.disabled:focus, .btn-info[disabled]:focus, fieldset[disabled] .btn-info:focus, .btn-info.disabled:active, .btn-info[disabled]:active, fieldset[disabled] .btn-info:active, .btn-info.disabled.active, .btn-info[disabled].active, fieldset[disabled] .btn-info.active { background-color: #5bc0de; border-color: #46b8da; } .btn-link { font-weight: normal; color: #428bca; cursor: pointer; border-radius: 0; } .btn-link, .btn-link:active, .btn-link[disabled], fieldset[disabled] .btn-link { background-color: transparent; -webkit-box-shadow: none; box-shadow: none; } .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active { border-color: transparent; } .btn-link:hover, .btn-link:focus { color: #2a6496; text-decoration: underline; background-color: transparent; } .btn-link[disabled]:hover, fieldset[disabled] .btn-link:hover, .btn-link[disabled]:focus, fieldset[disabled] .btn-link:focus { color: #999999; text-decoration: none; } .btn-lg { padding: 10px 16px; font-size: 18px; line-height: 1.33; border-radius: 6px; } .btn-sm, .btn-xs { padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .btn-xs { padding: 1px 5px; } .btn-block { display: block; width: 100%; padding-right: 0; padding-left: 0; } .btn-block + .btn-block { margin-top: 5px; } input[type="submit"].btn-block, input[type="reset"].btn-block, input[type="button"].btn-block { width: 100%; } .fade { opacity: 0; -webkit-transition: opacity 0.15s linear; transition: opacity 0.15s linear; } .fade.in { opacity: 1; } .collapse { display: none; } .collapse.in { display: block; } .collapsing { position: relative; height: 0; overflow: hidden; -webkit-transition: height 0.35s ease; transition: height 0.35s ease; } @font-face { font-family: 'Glyphicons Halflings'; src: url('../fonts/glyphicons-halflings-regular.eot'); 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'); } .glyphicon { position: relative; top: 1px; display: inline-block; font-family: 'Glyphicons Halflings'; -webkit-font-smoothing: antialiased; font-style: normal; font-weight: normal; line-height: 1; } .glyphicon-asterisk:before { content: "\2a"; } .glyphicon-plus:before { content: "\2b"; } .glyphicon-euro:before { content: "\20ac"; } .glyphicon-minus:before { content: "\2212"; } .glyphicon-cloud:before { content: "\2601"; } .glyphicon-envelope:before { content: "\2709"; } .glyphicon-pencil:before { content: "\270f"; } .glyphicon-glass:before { content: "\e001"; } .glyphicon-music:before { content: "\e002"; } .glyphicon-search:before { content: "\e003"; } .glyphicon-heart:before { content: "\e005"; } .glyphicon-star:before { content: "\e006"; } .glyphicon-star-empty:before { content: "\e007"; } .glyphicon-user:before { content: "\e008"; } .glyphicon-film:before { content: "\e009"; } .glyphicon-th-large:before { content: "\e010"; } .glyphicon-th:before { content: "\e011"; } .glyphicon-th-list:before { content: "\e012"; } .glyphicon-ok:before { content: "\e013"; } .glyphicon-remove:before { content: "\e014"; } .glyphicon-zoom-in:before { content: "\e015"; } .glyphicon-zoom-out:before { content: "\e016"; } .glyphicon-off:before { content: "\e017"; } .glyphicon-signal:before { content: "\e018"; } .glyphicon-cog:before { content: "\e019"; } .glyphicon-trash:before { content: "\e020"; } .glyphicon-home:before { content: "\e021"; } .glyphicon-file:before { content: "\e022"; } .glyphicon-time:before { content: "\e023"; } .glyphicon-road:before { content: "\e024"; } .glyphicon-download-alt:before { content: "\e025"; } .glyphicon-download:before { content: "\e026"; } .glyphicon-upload:before { content: "\e027"; } .glyphicon-inbox:before { content: "\e028"; } .glyphicon-play-circle:before { content: "\e029"; } .glyphicon-repeat:before { content: "\e030"; } .glyphicon-refresh:before { content: "\e031"; } .glyphicon-list-alt:before { content: "\e032"; } .glyphicon-flag:before { content: "\e034"; } .glyphicon-headphones:before { content: "\e035"; } .glyphicon-volume-off:before { content: "\e036"; } .glyphicon-volume-down:before { content: "\e037"; } .glyphicon-volume-up:before { content: "\e038"; } .glyphicon-qrcode:before { content: "\e039"; } .glyphicon-barcode:before { content: "\e040"; } .glyphicon-tag:before { content: "\e041"; } .glyphicon-tags:before { content: "\e042"; } .glyphicon-book:before { content: "\e043"; } .glyphicon-print:before { content: "\e045"; } .glyphicon-font:before { content: "\e047"; } .glyphicon-bold:before { content: "\e048"; } .glyphicon-italic:before { content: "\e049"; } .glyphicon-text-height:before { content: "\e050"; } .glyphicon-text-width:before { content: "\e051"; } .glyphicon-align-left:before { content: "\e052"; } .glyphicon-align-center:before { content: "\e053"; } .glyphicon-align-right:before { content: "\e054"; } .glyphicon-align-justify:before { content: "\e055"; } .glyphicon-list:before { content: "\e056"; } .glyphicon-indent-left:before { content: "\e057"; } .glyphicon-indent-right:before { content: "\e058"; } .glyphicon-facetime-video:before { content: "\e059"; } .glyphicon-picture:before { content: "\e060"; } .glyphicon-map-marker:before { content: "\e062"; } .glyphicon-adjust:before { content: "\e063"; } .glyphicon-tint:before { content: "\e064"; } .glyphicon-edit:before { content: "\e065"; } .glyphicon-share:before { content: "\e066"; } .glyphicon-check:before { content: "\e067"; } .glyphicon-move:before { content: "\e068"; } .glyphicon-step-backward:before { content: "\e069"; } .glyphicon-fast-backward:before { content: "\e070"; } .glyphicon-backward:before { content: "\e071"; } .glyphicon-play:before { content: "\e072"; } .glyphicon-pause:before { content: "\e073"; } .glyphicon-stop:before { content: "\e074"; } .glyphicon-forward:before { content: "\e075"; } .glyphicon-fast-forward:before { content: "\e076"; } .glyphicon-step-forward:before { content: "\e077"; } .glyphicon-eject:before { content: "\e078"; } .glyphicon-chevron-left:before { content: "\e079"; } .glyphicon-chevron-right:before { content: "\e080"; } .glyphicon-plus-sign:before { content: "\e081"; } .glyphicon-minus-sign:before { content: "\e082"; } .glyphicon-remove-sign:before { content: "\e083"; } .glyphicon-ok-sign:before { content: "\e084"; } .glyphicon-question-sign:before { content: "\e085"; } .glyphicon-info-sign:before { content: "\e086"; } .glyphicon-screenshot:before { content: "\e087"; } .glyphicon-remove-circle:before { content: "\e088"; } .glyphicon-ok-circle:before { content: "\e089"; } .glyphicon-ban-circle:before { content: "\e090"; } .glyphicon-arrow-left:before { content: "\e091"; } .glyphicon-arrow-right:before { content: "\e092"; } .glyphicon-arrow-up:before { content: "\e093"; } .glyphicon-arrow-down:before { content: "\e094"; } .glyphicon-share-alt:before { content: "\e095"; } .glyphicon-resize-full:before { content: "\e096"; } .glyphicon-resize-small:before { content: "\e097"; } .glyphicon-exclamation-sign:before { content: "\e101"; } .glyphicon-gift:before { content: "\e102"; } .glyphicon-leaf:before { content: "\e103"; } .glyphicon-eye-open:before { content: "\e105"; } .glyphicon-eye-close:before { content: "\e106"; } .glyphicon-warning-sign:before { content: "\e107"; } .glyphicon-plane:before { content: "\e108"; } .glyphicon-random:before { content: "\e110"; } .glyphicon-comment:before { content: "\e111"; } .glyphicon-magnet:before { content: "\e112"; } .glyphicon-chevron-up:before { content: "\e113"; } .glyphicon-chevron-down:before { content: "\e114"; } .glyphicon-retweet:before { content: "\e115"; } .glyphicon-shopping-cart:before { content: "\e116"; } .glyphicon-folder-close:before { content: "\e117"; } .glyphicon-folder-open:before { content: "\e118"; } .glyphicon-resize-vertical:before { content: "\e119"; } .glyphicon-resize-horizontal:before { content: "\e120"; } .glyphicon-hdd:before { content: "\e121"; } .glyphicon-bullhorn:before { content: "\e122"; } .glyphicon-certificate:before { content: "\e124"; } .glyphicon-thumbs-up:before { content: "\e125"; } .glyphicon-thumbs-down:before { content: "\e126"; } .glyphicon-hand-right:before { content: "\e127"; } .glyphicon-hand-left:before { content: "\e128"; } .glyphicon-hand-up:before { content: "\e129"; } .glyphicon-hand-down:before { content: "\e130"; } .glyphicon-circle-arrow-right:before { content: "\e131"; } .glyphicon-circle-arrow-left:before { content: "\e132"; } .glyphicon-circle-arrow-up:before { content: "\e133"; } .glyphicon-circle-arrow-down:before { content: "\e134"; } .glyphicon-globe:before { content: "\e135"; } .glyphicon-tasks:before { content: "\e137"; } .glyphicon-filter:before { content: "\e138"; } .glyphicon-fullscreen:before { content: "\e140"; } .glyphicon-dashboard:before { content: "\e141"; } .glyphicon-heart-empty:before { content: "\e143"; } .glyphicon-link:before { content: "\e144"; } .glyphicon-phone:before { content: "\e145"; } .glyphicon-usd:before { content: "\e148"; } .glyphicon-gbp:before { content: "\e149"; } .glyphicon-sort:before { content: "\e150"; } .glyphicon-sort-by-alphabet:before { content: "\e151"; } .glyphicon-sort-by-alphabet-alt:before { content: "\e152"; } .glyphicon-sort-by-order:before { content: "\e153"; } .glyphicon-sort-by-order-alt:before { content: "\e154"; } .glyphicon-sort-by-attributes:before { content: "\e155"; } .glyphicon-sort-by-attributes-alt:before { content: "\e156"; } .glyphicon-unchecked:before { content: "\e157"; } .glyphicon-expand:before { content: "\e158"; } .glyphicon-collapse-down:before { content: "\e159"; } .glyphicon-collapse-up:before { content: "\e160"; } .glyphicon-log-in:before { content: "\e161"; } .glyphicon-flash:before { content: "\e162"; } .glyphicon-log-out:before { content: "\e163"; } .glyphicon-new-window:before { content: "\e164"; } .glyphicon-record:before { content: "\e165"; } .glyphicon-save:before { content: "\e166"; } .glyphicon-open:before { content: "\e167"; } .glyphicon-saved:before { content: "\e168"; } .glyphicon-import:before { content: "\e169"; } .glyphicon-export:before { content: "\e170"; } .glyphicon-send:before { content: "\e171"; } .glyphicon-floppy-disk:before { content: "\e172"; } .glyphicon-floppy-saved:before { content: "\e173"; } .glyphicon-floppy-remove:before { content: "\e174"; } .glyphicon-floppy-save:before { content: "\e175"; } .glyphicon-floppy-open:before { content: "\e176"; } .glyphicon-credit-card:before { content: "\e177"; } .glyphicon-transfer:before { content: "\e178"; } .glyphicon-cutlery:before { content: "\e179"; } .glyphicon-header:before { content: "\e180"; } .glyphicon-compressed:before { content: "\e181"; } .glyphicon-earphone:before { content: "\e182"; } .glyphicon-phone-alt:before { content: "\e183"; } .glyphicon-tower:before { content: "\e184"; } .glyphicon-stats:before { content: "\e185"; } .glyphicon-sd-video:before { content: "\e186"; } .glyphicon-hd-video:before { content: "\e187"; } .glyphicon-subtitles:before { content: "\e188"; } .glyphicon-sound-stereo:before { content: "\e189"; } .glyphicon-sound-dolby:before { content: "\e190"; } .glyphicon-sound-5-1:before { content: "\e191"; } .glyphicon-sound-6-1:before { content: "\e192"; } .glyphicon-sound-7-1:before { content: "\e193"; } .glyphicon-copyright-mark:before { content: "\e194"; } .glyphicon-registration-mark:before { content: "\e195"; } .glyphicon-cloud-download:before { content: "\e197"; } .glyphicon-cloud-upload:before { content: "\e198"; } .glyphicon-tree-conifer:before { content: "\e199"; } .glyphicon-tree-deciduous:before { content: "\e200"; } .glyphicon-briefcase:before { content: "\1f4bc"; } .glyphicon-calendar:before { content: "\1f4c5"; } .glyphicon-pushpin:before { content: "\1f4cc"; } .glyphicon-paperclip:before { content: "\1f4ce"; } .glyphicon-camera:before { content: "\1f4f7"; } .glyphicon-lock:before { content: "\1f512"; } .glyphicon-bell:before { content: "\1f514"; } .glyphicon-bookmark:before { content: "\1f516"; } .glyphicon-fire:before { content: "\1f525"; } .glyphicon-wrench:before { content: "\1f527"; } .caret { display: inline-block; width: 0; height: 0; margin-left: 2px; vertical-align: middle; border-top: 4px solid #000000; border-right: 4px solid transparent; border-bottom: 0 dotted; border-left: 4px solid transparent; content: ""; } .dropdown { position: relative; } .dropdown-toggle:focus { outline: 0; } .dropdown-menu { position: absolute; top: 100%; left: 0; z-index: 1000; display: none; float: left; min-width: 160px; padding: 5px 0; margin: 2px 0 0; font-size: 14px; list-style: none; background-color: #ffffff; border: 1px solid #cccccc; border: 1px solid rgba(0, 0, 0, 0.15); border-radius: 4px; -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); background-clip: padding-box; } .dropdown-menu.pull-right { right: 0; left: auto; } .dropdown-menu .divider { height: 1px; margin: 9px 0; overflow: hidden; background-color: #e5e5e5; } .dropdown-menu > li > a { display: block; padding: 3px 20px; clear: both; font-weight: normal; line-height: 1.428571429; color: #333333; white-space: nowrap; } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { color: #ffffff; text-decoration: none; background-color: #428bca; } .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { color: #ffffff; text-decoration: none; background-color: #428bca; outline: 0; } .dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { color: #999999; } .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { text-decoration: none; cursor: not-allowed; background-color: transparent; background-image: none; filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); } .open > .dropdown-menu { display: block; } .open > a { outline: 0; } .dropdown-header { display: block; padding: 3px 20px; font-size: 12px; line-height: 1.428571429; color: #999999; } .dropdown-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 990; } .pull-right > .dropdown-menu { right: 0; left: auto; } .dropup .caret, .navbar-fixed-bottom .dropdown .caret { border-top: 0 dotted; border-bottom: 4px solid #000000; content: ""; } .dropup .dropdown-menu, .navbar-fixed-bottom .dropdown .dropdown-menu { top: auto; bottom: 100%; margin-bottom: 1px; } @media (min-width: 768px) { .navbar-right .dropdown-menu { right: 0; left: auto; } } .btn-default .caret { border-top-color: #333333; } .btn-primary .caret, .btn-success .caret, .btn-warning .caret, .btn-danger .caret, .btn-info .caret { border-top-color: #fff; } .dropup .btn-default .caret { border-bottom-color: #333333; } .dropup .btn-primary .caret, .dropup .btn-success .caret, .dropup .btn-warning .caret, .dropup .btn-danger .caret, .dropup .btn-info .caret { border-bottom-color: #fff; } .btn-group, .btn-group-vertical { position: relative; display: inline-block; vertical-align: middle; } .btn-group > .btn, .btn-group-vertical > .btn { position: relative; float: left; } .btn-group > .btn:hover, .btn-group-vertical > .btn:hover, .btn-group > .btn:focus, .btn-group-vertical > .btn:focus, .btn-group > .btn:active, .btn-group-vertical > .btn:active, .btn-group > .btn.active, .btn-group-vertical > .btn.active { z-index: 2; } .btn-group > .btn:focus, .btn-group-vertical > .btn:focus { outline: none; } .btn-group .btn + .btn, .btn-group .btn + .btn-group, .btn-group .btn-group + .btn, .btn-group .btn-group + .btn-group { margin-left: -1px; } .btn-toolbar:before, .btn-toolbar:after { display: table; content: " "; } .btn-toolbar:after { clear: both; } .btn-toolbar:before, .btn-toolbar:after { display: table; content: " "; } .btn-toolbar:after { clear: both; } .btn-toolbar .btn-group { float: left; } .btn-toolbar > .btn + .btn, .btn-toolbar > .btn-group + .btn, .btn-toolbar > .btn + .btn-group, .btn-toolbar > .btn-group + .btn-group { margin-left: 5px; } .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { border-radius: 0; } .btn-group > .btn:first-child { margin-left: 0; } .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { border-top-right-radius: 0; border-bottom-right-radius: 0; } .btn-group > .btn:last-child:not(:first-child), .btn-group > .dropdown-toggle:not(:first-child) { border-bottom-left-radius: 0; border-top-left-radius: 0; } .btn-group > .btn-group { float: left; } .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group > .btn-group:first-child > .btn:last-child, .btn-group > .btn-group:first-child > .dropdown-toggle { border-top-right-radius: 0; border-bottom-right-radius: 0; } .btn-group > .btn-group:last-child > .btn:first-child { border-bottom-left-radius: 0; border-top-left-radius: 0; } .btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { outline: 0; } .btn-group-xs > .btn { padding: 5px 10px; padding: 1px 5px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .btn-group-sm > .btn { padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .btn-group-lg > .btn { padding: 10px 16px; font-size: 18px; line-height: 1.33; border-radius: 6px; } .btn-group > .btn + .dropdown-toggle { padding-right: 8px; padding-left: 8px; } .btn-group > .btn-lg + .dropdown-toggle { padding-right: 12px; padding-left: 12px; } .btn-group.open .dropdown-toggle { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn .caret { margin-left: 0; } .btn-lg .caret { border-width: 5px 5px 0; border-bottom-width: 0; } .dropup .btn-lg .caret { border-width: 0 5px 5px; } .btn-group-vertical > .btn, .btn-group-vertical > .btn-group { display: block; float: none; width: 100%; max-width: 100%; } .btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after { display: table; content: " "; } .btn-group-vertical > .btn-group:after { clear: both; } .btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after { display: table; content: " "; } .btn-group-vertical > .btn-group:after { clear: both; } .btn-group-vertical > .btn-group > .btn { float: none; } .btn-group-vertical > .btn + .btn, .btn-group-vertical > .btn + .btn-group, .btn-group-vertical > .btn-group + .btn, .btn-group-vertical > .btn-group + .btn-group { margin-top: -1px; margin-left: 0; } .btn-group-vertical > .btn:not(:first-child):not(:last-child) { border-radius: 0; } .btn-group-vertical > .btn:first-child:not(:last-child) { border-top-right-radius: 4px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn:last-child:not(:first-child) { border-top-right-radius: 0; border-bottom-left-radius: 4px; border-top-left-radius: 0; } .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group-vertical > .btn-group:first-child > .btn:last-child, .btn-group-vertical > .btn-group:first-child > .dropdown-toggle { border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn-group:last-child > .btn:first-child { border-top-right-radius: 0; border-top-left-radius: 0; } .btn-group-justified { display: table; width: 100%; border-collapse: separate; table-layout: fixed; } .btn-group-justified .btn { display: table-cell; float: none; width: 1%; } [data-toggle="buttons"] > .btn > input[type="radio"], [data-toggle="buttons"] > .btn > input[type="checkbox"] { display: none; } .input-group { position: relative; display: table; border-collapse: separate; } .input-group.col { float: none; padding-right: 0; padding-left: 0; } .input-group .form-control { width: 100%; margin-bottom: 0; } .input-group-lg > .form-control, .input-group-lg > .input-group-addon, .input-group-lg > .input-group-btn > .btn { height: 45px; padding: 10px 16px; font-size: 18px; line-height: 1.33; border-radius: 6px; } select.input-group-lg > .form-control, select.input-group-lg > .input-group-addon, select.input-group-lg > .input-group-btn > .btn { height: 45px; line-height: 45px; } textarea.input-group-lg > .form-control, textarea.input-group-lg > .input-group-addon, textarea.input-group-lg > .input-group-btn > .btn { height: auto; } .input-group-sm > .form-control, .input-group-sm > .input-group-addon, .input-group-sm > .input-group-btn > .btn { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } select.input-group-sm > .form-control, select.input-group-sm > .input-group-addon, select.input-group-sm > .input-group-btn > .btn { height: 30px; line-height: 30px; } textarea.input-group-sm > .form-control, textarea.input-group-sm > .input-group-addon, textarea.input-group-sm > .input-group-btn > .btn { height: auto; } .input-group-addon, .input-group-btn, .input-group .form-control { display: table-cell; } .input-group-addon:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child), .input-group .form-control:not(:first-child):not(:last-child) { border-radius: 0; } .input-group-addon, .input-group-btn { width: 1%; white-space: nowrap; vertical-align: middle; } .input-group-addon { padding: 6px 12px; font-size: 14px; font-weight: normal; line-height: 1; text-align: center; background-color: #eeeeee; border: 1px solid #cccccc; border-radius: 4px; } .input-group-addon.input-sm { padding: 5px 10px; font-size: 12px; border-radius: 3px; } .input-group-addon.input-lg { padding: 10px 16px; font-size: 18px; border-radius: 6px; } .input-group-addon input[type="radio"], .input-group-addon input[type="checkbox"] { margin-top: 0; } .input-group .form-control:first-child, .input-group-addon:first-child, .input-group-btn:first-child > .btn, .input-group-btn:first-child > .dropdown-toggle, .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) { border-top-right-radius: 0; border-bottom-right-radius: 0; } .input-group-addon:first-child { border-right: 0; } .input-group .form-control:last-child, .input-group-addon:last-child, .input-group-btn:last-child > .btn, .input-group-btn:last-child > .dropdown-toggle, .input-group-btn:first-child > .btn:not(:first-child) { border-bottom-left-radius: 0; border-top-left-radius: 0; } .input-group-addon:last-child { border-left: 0; } .input-group-btn { position: relative; white-space: nowrap; } .input-group-btn > .btn { position: relative; } .input-group-btn > .btn + .btn { margin-left: -4px; } .input-group-btn > .btn:hover, .input-group-btn > .btn:active { z-index: 2; } .nav { padding-left: 0; margin-bottom: 0; list-style: none; } .nav:before, .nav:after { display: table; content: " "; } .nav:after { clear: both; } .nav:before, .nav:after { display: table; content: " "; } .nav:after { clear: both; } .nav > li { position: relative; display: block; } .nav > li > a { position: relative; display: block; padding: 10px 15px; } .nav > li > a:hover, .nav > li > a:focus { text-decoration: none; background-color: #eeeeee; } .nav > li.disabled > a { color: #999999; } .nav > li.disabled > a:hover, .nav > li.disabled > a:focus { color: #999999; text-decoration: none; cursor: not-allowed; background-color: transparent; } .nav .open > a, .nav .open > a:hover, .nav .open > a:focus { background-color: #eeeeee; border-color: #428bca; } .nav .nav-divider { height: 1px; margin: 9px 0; overflow: hidden; background-color: #e5e5e5; } .nav > li > a > img { max-width: none; } .nav-tabs { border-bottom: 1px solid #dddddd; } .nav-tabs > li { float: left; margin-bottom: -1px; } .nav-tabs > li > a { margin-right: 2px; line-height: 1.428571429; border: 1px solid transparent; border-radius: 4px 4px 0 0; } .nav-tabs > li > a:hover { border-color: #eeeeee #eeeeee #dddddd; } .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { color: #555555; cursor: default; background-color: #ffffff; border: 1px solid #dddddd; border-bottom-color: transparent; } .nav-tabs.nav-justified { width: 100%; border-bottom: 0; } .nav-tabs.nav-justified > li { float: none; } .nav-tabs.nav-justified > li > a { text-align: center; } @media (min-width: 768px) { .nav-tabs.nav-justified > li { display: table-cell; width: 1%; } } .nav-tabs.nav-justified > li > a { margin-right: 0; border-bottom: 1px solid #dddddd; } .nav-tabs.nav-justified > .active > a { border-bottom-color: #ffffff; } .nav-pills > li { float: left; } .nav-pills > li > a { border-radius: 5px; } .nav-pills > li + li { margin-left: 2px; } .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { color: #ffffff; background-color: #428bca; } .nav-stacked > li { float: none; } .nav-stacked > li + li { margin-top: 2px; margin-left: 0; } .nav-justified { width: 100%; } .nav-justified > li { float: none; } .nav-justified > li > a { text-align: center; } @media (min-width: 768px) { .nav-justified > li { display: table-cell; width: 1%; } } .nav-tabs-justified { border-bottom: 0; } .nav-tabs-justified > li > a { margin-right: 0; border-bottom: 1px solid #dddddd; } .nav-tabs-justified > .active > a { border-bottom-color: #ffffff; } .tabbable:before, .tabbable:after { display: table; content: " "; } .tabbable:after { clear: both; } .tabbable:before, .tabbable:after { display: table; content: " "; } .tabbable:after { clear: both; } .tab-content > .tab-pane, .pill-content > .pill-pane { display: none; } .tab-content > .active, .pill-content > .active { display: block; } .nav .caret { border-top-color: #428bca; border-bottom-color: #428bca; } .nav a:hover .caret { border-top-color: #2a6496; border-bottom-color: #2a6496; } .nav-tabs .dropdown-menu { margin-top: -1px; border-top-right-radius: 0; border-top-left-radius: 0; } .navbar { position: relative; z-index: 1000; min-height: 50px; margin-bottom: 20px; border: 1px solid transparent; } .navbar:before, .navbar:after { display: table; content: " "; } .navbar:after { clear: both; } .navbar:before, .navbar:after { display: table; content: " "; } .navbar:after { clear: both; } @media (min-width: 768px) { .navbar { border-radius: 4px; } } .navbar-header:before, .navbar-header:after { display: table; content: " "; } .navbar-header:after { clear: both; } .navbar-header:before, .navbar-header:after { display: table; content: " "; } .navbar-header:after { clear: both; } @media (min-width: 768px) { .navbar-header { float: left; } } .navbar-collapse { max-height: 340px; padding-right: 15px; padding-left: 15px; overflow-x: visible; border-top: 1px solid transparent; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); -webkit-overflow-scrolling: touch; } .navbar-collapse:before, .navbar-collapse:after { display: table; content: " "; } .navbar-collapse:after { clear: both; } .navbar-collapse:before, .navbar-collapse:after { display: table; content: " "; } .navbar-collapse:after { clear: both; } .navbar-collapse.in { overflow-y: auto; } @media (min-width: 768px) { .navbar-collapse { width: auto; border-top: 0; box-shadow: none; } .navbar-collapse.collapse { display: block !important; height: auto !important; padding-bottom: 0; overflow: visible !important; } .navbar-collapse.in { overflow-y: visible; } .navbar-collapse .navbar-nav.navbar-left:first-child { margin-left: -15px; } .navbar-collapse .navbar-nav.navbar-right:last-child { margin-right: -15px; } .navbar-collapse .navbar-text:last-child { margin-right: 0; } } .container > .navbar-header, .container > .navbar-collapse { margin-right: -15px; margin-left: -15px; } @media (min-width: 768px) { .container > .navbar-header, .container > .navbar-collapse { margin-right: 0; margin-left: 0; } } .navbar-static-top { border-width: 0 0 1px; } @media (min-width: 768px) { .navbar-static-top { border-radius: 0; } } .navbar-fixed-top, .navbar-fixed-bottom { position: fixed; right: 0; left: 0; border-width: 0 0 1px; } @media (min-width: 768px) { .navbar-fixed-top, .navbar-fixed-bottom { border-radius: 0; } } .navbar-fixed-top { top: 0; z-index: 1030; } .navbar-fixed-bottom { bottom: 0; margin-bottom: 0; } .navbar-brand { float: left; padding: 15px 15px; font-size: 18px; line-height: 20px; } .navbar-brand:hover, .navbar-brand:focus { text-decoration: none; } @media (min-width: 768px) { .navbar > .container .navbar-brand { margin-left: -15px; } } .navbar-toggle { position: relative; float: right; padding: 9px 10px; margin-top: 8px; margin-right: 15px; margin-bottom: 8px; background-color: transparent; border: 1px solid transparent; border-radius: 4px; } .navbar-toggle .icon-bar { display: block; width: 22px; height: 2px; border-radius: 1px; } .navbar-toggle .icon-bar + .icon-bar { margin-top: 4px; } @media (min-width: 768px) { .navbar-toggle { display: none; } } .navbar-nav { margin: 7.5px -15px; } .navbar-nav > li > a { padding-top: 10px; padding-bottom: 10px; line-height: 20px; } @media (max-width: 767px) { .navbar-nav .open .dropdown-menu { position: static; float: none; width: auto; margin-top: 0; background-color: transparent; border: 0; box-shadow: none; } .navbar-nav .open .dropdown-menu > li > a, .navbar-nav .open .dropdown-menu .dropdown-header { padding: 5px 15px 5px 25px; } .navbar-nav .open .dropdown-menu > li > a { line-height: 20px; } .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus { background-image: none; } } @media (min-width: 768px) { .navbar-nav { float: left; margin: 0; } .navbar-nav > li { float: left; } .navbar-nav > li > a { padding-top: 15px; padding-bottom: 15px; } } @media (min-width: 768px) { .navbar-left { float: left !important; } .navbar-right { float: right !important; } } .navbar-form { padding: 10px 15px; margin-top: 8px; margin-right: -15px; margin-bottom: 8px; margin-left: -15px; border-top: 1px solid transparent; border-bottom: 1px solid transparent; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); } @media (min-width: 768px) { .navbar-form .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .navbar-form .form-control { display: inline-block; } .navbar-form .radio, .navbar-form .checkbox { display: inline-block; padding-left: 0; margin-top: 0; margin-bottom: 0; } .navbar-form .radio input[type="radio"], .navbar-form .checkbox input[type="checkbox"] { float: none; margin-left: 0; } } @media (max-width: 767px) { .navbar-form .form-group { margin-bottom: 5px; } } @media (min-width: 768px) { .navbar-form { width: auto; padding-top: 0; padding-bottom: 0; margin-right: 0; margin-left: 0; border: 0; -webkit-box-shadow: none; box-shadow: none; } } .navbar-nav > li > .dropdown-menu { margin-top: 0; border-top-right-radius: 0; border-top-left-radius: 0; } .navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .navbar-nav.pull-right > li > .dropdown-menu, .navbar-nav > li > .dropdown-menu.pull-right { right: 0; left: auto; } .navbar-btn { margin-top: 8px; margin-bottom: 8px; } .navbar-text { float: left; margin-top: 15px; margin-bottom: 15px; } @media (min-width: 768px) { .navbar-text { margin-right: 15px; margin-left: 15px; } } .navbar-default { background-color: #f8f8f8; border-color: #e7e7e7; } .navbar-default .navbar-brand { color: #777777; } .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { color: #5e5e5e; background-color: transparent; } .navbar-default .navbar-text { color: #777777; } .navbar-default .navbar-nav > li > a { color: #777777; } .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { color: #333333; background-color: transparent; } .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { color: #555555; background-color: #e7e7e7; } .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { color: #cccccc; background-color: transparent; } .navbar-default .navbar-toggle { border-color: #dddddd; } .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { background-color: #dddddd; } .navbar-default .navbar-toggle .icon-bar { background-color: #cccccc; } .navbar-default .navbar-collapse, .navbar-default .navbar-form { border-color: #e6e6e6; } .navbar-default .navbar-nav > .dropdown > a:hover .caret, .navbar-default .navbar-nav > .dropdown > a:focus .caret { border-top-color: #333333; border-bottom-color: #333333; } .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { color: #555555; background-color: #e7e7e7; } .navbar-default .navbar-nav > .open > a .caret, .navbar-default .navbar-nav > .open > a:hover .caret, .navbar-default .navbar-nav > .open > a:focus .caret { border-top-color: #555555; border-bottom-color: #555555; } .navbar-default .navbar-nav > .dropdown > a .caret { border-top-color: #777777; border-bottom-color: #777777; } @media (max-width: 767px) { .navbar-default .navbar-nav .open .dropdown-menu > li > a { color: #777777; } .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { color: #333333; background-color: transparent; } .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { color: #555555; background-color: #e7e7e7; } .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #cccccc; background-color: transparent; } } .navbar-default .navbar-link { color: #777777; } .navbar-default .navbar-link:hover { color: #333333; } .navbar-inverse { background-color: #222222; border-color: #080808; } .navbar-inverse .navbar-brand { color: #999999; } .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-text { color: #999999; } .navbar-inverse .navbar-nav > li > a { color: #999999; } .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { color: #ffffff; background-color: #080808; } .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { color: #444444; background-color: transparent; } .navbar-inverse .navbar-toggle { border-color: #333333; } .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { background-color: #333333; } .navbar-inverse .navbar-toggle .icon-bar { background-color: #ffffff; } .navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { border-color: #101010; } .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { color: #ffffff; background-color: #080808; } .navbar-inverse .navbar-nav > .dropdown > a:hover .caret { border-top-color: #ffffff; border-bottom-color: #ffffff; } .navbar-inverse .navbar-nav > .dropdown > a .caret { border-top-color: #999999; border-bottom-color: #999999; } .navbar-inverse .navbar-nav > .open > a .caret, .navbar-inverse .navbar-nav > .open > a:hover .caret, .navbar-inverse .navbar-nav > .open > a:focus .caret { border-top-color: #ffffff; border-bottom-color: #ffffff; } @media (max-width: 767px) { .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { border-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { color: #999999; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { color: #ffffff; background-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #444444; background-color: transparent; } } .navbar-inverse .navbar-link { color: #999999; } .navbar-inverse .navbar-link:hover { color: #ffffff; } .breadcrumb { padding: 8px 15px; margin-bottom: 20px; list-style: none; background-color: #f5f5f5; border-radius: 4px; } .breadcrumb > li { display: inline-block; } .breadcrumb > li + li:before { padding: 0 5px; color: #cccccc; content: "/\00a0"; } .breadcrumb > .active { color: #999999; } .pagination { display: inline-block; padding-left: 0; margin: 20px 0; border-radius: 4px; } .pagination > li { display: inline; } .pagination > li > a, .pagination > li > span { position: relative; float: left; padding: 6px 12px; margin-left: -1px; line-height: 1.428571429; text-decoration: none; background-color: #ffffff; border: 1px solid #dddddd; } .pagination > li:first-child > a, .pagination > li:first-child > span { margin-left: 0; border-bottom-left-radius: 4px; border-top-left-radius: 4px; } .pagination > li:last-child > a, .pagination > li:last-child > span { border-top-right-radius: 4px; border-bottom-right-radius: 4px; } .pagination > li > a:hover, .pagination > li > span:hover, .pagination > li > a:focus, .pagination > li > span:focus { background-color: #eeeeee; } .pagination > .active > a, .pagination > .active > span, .pagination > .active > a:hover, .pagination > .active > span:hover, .pagination > .active > a:focus, .pagination > .active > span:focus { z-index: 2; color: #ffffff; cursor: default; background-color: #428bca; border-color: #428bca; } .pagination > .disabled > span, .pagination > .disabled > a, .pagination > .disabled > a:hover, .pagination > .disabled > a:focus { color: #999999; cursor: not-allowed; background-color: #ffffff; border-color: #dddddd; } .pagination-lg > li > a, .pagination-lg > li > span { padding: 10px 16px; font-size: 18px; } .pagination-lg > li:first-child > a, .pagination-lg > li:first-child > span { border-bottom-left-radius: 6px; border-top-left-radius: 6px; } .pagination-lg > li:last-child > a, .pagination-lg > li:last-child > span { border-top-right-radius: 6px; border-bottom-right-radius: 6px; } .pagination-sm > li > a, .pagination-sm > li > span { padding: 5px 10px; font-size: 12px; } .pagination-sm > li:first-child > a, .pagination-sm > li:first-child > span { border-bottom-left-radius: 3px; border-top-left-radius: 3px; } .pagination-sm > li:last-child > a, .pagination-sm > li:last-child > span { border-top-right-radius: 3px; border-bottom-right-radius: 3px; } .pager { padding-left: 0; margin: 20px 0; text-align: center; list-style: none; } .pager:before, .pager:after { display: table; content: " "; } .pager:after { clear: both; } .pager:before, .pager:after { display: table; content: " "; } .pager:after { clear: both; } .pager li { display: inline; } .pager li > a, .pager li > span { display: inline-block; padding: 5px 14px; background-color: #ffffff; border: 1px solid #dddddd; border-radius: 15px; } .pager li > a:hover, .pager li > a:focus { text-decoration: none; background-color: #eeeeee; } .pager .next > a, .pager .next > span { float: right; } .pager .previous > a, .pager .previous > span { float: left; } .pager .disabled > a, .pager .disabled > a:hover, .pager .disabled > a:focus, .pager .disabled > span { color: #999999; cursor: not-allowed; background-color: #ffffff; } .label { display: inline; padding: .2em .6em .3em; font-size: 75%; font-weight: bold; line-height: 1; color: #ffffff; text-align: center; white-space: nowrap; vertical-align: baseline; border-radius: .25em; } .label[href]:hover, .label[href]:focus { color: #ffffff; text-decoration: none; cursor: pointer; } .label:empty { display: none; } .label-default { background-color: #999999; } .label-default[href]:hover, .label-default[href]:focus { background-color: #808080; } .label-primary { background-color: #428bca; } .label-primary[href]:hover, .label-primary[href]:focus { background-color: #3071a9; } .label-success { background-color: #5cb85c; } .label-success[href]:hover, .label-success[href]:focus { background-color: #449d44; } .label-info { background-color: #5bc0de; } .label-info[href]:hover, .label-info[href]:focus { background-color: #31b0d5; } .label-warning { background-color: #f0ad4e; } .label-warning[href]:hover, .label-warning[href]:focus { background-color: #ec971f; } .label-danger { background-color: #d9534f; } .label-danger[href]:hover, .label-danger[href]:focus { background-color: #c9302c; } .badge { display: inline-block; min-width: 10px; padding: 3px 7px; font-size: 12px; font-weight: bold; line-height: 1; color: #ffffff; text-align: center; white-space: nowrap; vertical-align: baseline; background-color: #999999; border-radius: 10px; } .badge:empty { display: none; } a.badge:hover, a.badge:focus { color: #ffffff; text-decoration: none; cursor: pointer; } .btn .badge { position: relative; top: -1px; } a.list-group-item.active > .badge, .nav-pills > .active > a > .badge { color: #428bca; background-color: #ffffff; } .nav-pills > li > a > .badge { margin-left: 3px; } .jumbotron { padding: 30px; margin-bottom: 30px; font-size: 21px; font-weight: 200; line-height: 2.1428571435; color: inherit; background-color: #eeeeee; } .jumbotron h1 { line-height: 1; color: inherit; } .jumbotron p { line-height: 1.4; } .container .jumbotron { border-radius: 6px; } @media screen and (min-width: 768px) { .jumbotron { padding-top: 48px; padding-bottom: 48px; } .container .jumbotron { padding-right: 60px; padding-left: 60px; } .jumbotron h1 { font-size: 63px; } } .thumbnail { display: inline-block; display: block; height: auto; max-width: 100%; padding: 4px; line-height: 1.428571429; background-color: #ffffff; border: 1px solid #dddddd; border-radius: 4px; -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; } .thumbnail > img { display: block; height: auto; max-width: 100%; } a.thumbnail:hover, a.thumbnail:focus { border-color: #428bca; } .thumbnail > img { margin-right: auto; margin-left: auto; } .thumbnail .caption { padding: 9px; color: #333333; } .alert { padding: 15px; margin-bottom: 20px; border: 1px solid transparent; border-radius: 4px; } .alert h4 { margin-top: 0; color: inherit; } .alert .alert-link { font-weight: bold; } .alert > p, .alert > ul { margin-bottom: 0; } .alert > p + p { margin-top: 5px; } .alert-dismissable { padding-right: 35px; } .alert-dismissable .close { position: relative; top: -2px; right: -21px; color: inherit; } .alert-success { color: #468847; background-color: #dff0d8; border-color: #d6e9c6; } .alert-success hr { border-top-color: #c9e2b3; } .alert-success .alert-link { color: #356635; } .alert-info { color: #3a87ad; background-color: #d9edf7; border-color: #bce8f1; } .alert-info hr { border-top-color: #a6e1ec; } .alert-info .alert-link { color: #2d6987; } .alert-warning { color: #c09853; background-color: #fcf8e3; border-color: #fbeed5; } .alert-warning hr { border-top-color: #f8e5be; } .alert-warning .alert-link { color: #a47e3c; } .alert-danger { color: #b94a48; background-color: #f2dede; border-color: #eed3d7; } .alert-danger hr { border-top-color: #e6c1c7; } .alert-danger .alert-link { color: #953b39; } @-webkit-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } @-moz-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } @-o-keyframes progress-bar-stripes { from { background-position: 0 0; } to { background-position: 40px 0; } } @keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } .progress { height: 20px; margin-bottom: 20px; overflow: hidden; background-color: #f5f5f5; border-radius: 4px; -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); } .progress-bar { float: left; width: 0; height: 100%; font-size: 12px; color: #ffffff; text-align: center; background-color: #428bca; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); -webkit-transition: width 0.6s ease; transition: width 0.6s ease; } .progress-striped .progress-bar { 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)); 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); 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); 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); background-size: 40px 40px; } .progress.active .progress-bar { -webkit-animation: progress-bar-stripes 2s linear infinite; -moz-animation: progress-bar-stripes 2s linear infinite; -ms-animation: progress-bar-stripes 2s linear infinite; -o-animation: progress-bar-stripes 2s linear infinite; animation: progress-bar-stripes 2s linear infinite; } .progress-bar-success { background-color: #5cb85c; } .progress-striped .progress-bar-success { 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)); 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); 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); 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); } .progress-bar-info { background-color: #5bc0de; } .progress-striped .progress-bar-info { 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)); 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); 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); 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); } .progress-bar-warning { background-color: #f0ad4e; } .progress-striped .progress-bar-warning { 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)); 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); 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); 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); } .progress-bar-danger { background-color: #d9534f; } .progress-striped .progress-bar-danger { 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)); 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); 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); 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); } .media, .media-body { overflow: hidden; zoom: 1; } .media, .media .media { margin-top: 15px; } .media:first-child { margin-top: 0; } .media-object { display: block; } .media-heading { margin: 0 0 5px; } .media > .pull-left { margin-right: 10px; } .media > .pull-right { margin-left: 10px; } .media-list { padding-left: 0; list-style: none; } .list-group { padding-left: 0; margin-bottom: 20px; } .list-group-item { position: relative; display: block; padding: 10px 15px; margin-bottom: -1px; background-color: #ffffff; border: 1px solid #dddddd; } .list-group-item:first-child { border-top-right-radius: 4px; border-top-left-radius: 4px; } .list-group-item:last-child { margin-bottom: 0; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; } .list-group-item > .badge { float: right; } .list-group-item > .badge + .badge { margin-right: 5px; } a.list-group-item { color: #555555; } a.list-group-item .list-group-item-heading { color: #333333; } a.list-group-item:hover, a.list-group-item:focus { text-decoration: none; background-color: #f5f5f5; } .list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { z-index: 2; color: #ffffff; background-color: #428bca; border-color: #428bca; } .list-group-item.active .list-group-item-heading, .list-group-item.active:hover .list-group-item-heading, .list-group-item.active:focus .list-group-item-heading { color: inherit; } .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text { color: #e1edf7; } .list-group-item-heading { margin-top: 0; margin-bottom: 5px; } .list-group-item-text { margin-bottom: 0; line-height: 1.3; } .panel { margin-bottom: 20px; background-color: #ffffff; border: 1px solid transparent; border-radius: 4px; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); } .panel-body { padding: 15px; } .panel-body:before, .panel-body:after { display: table; content: " "; } .panel-body:after { clear: both; } .panel-body:before, .panel-body:after { display: table; content: " "; } .panel-body:after { clear: both; } .panel > .list-group { margin-bottom: 0; } .panel > .list-group .list-group-item { border-width: 1px 0; } .panel > .list-group .list-group-item:first-child { border-top-right-radius: 0; border-top-left-radius: 0; } .panel > .list-group .list-group-item:last-child { border-bottom: 0; } .panel-heading + .list-group .list-group-item:first-child { border-top-width: 0; } .panel > .table { margin-bottom: 0; } .panel > .panel-body + .table { border-top: 1px solid #dddddd; } .panel-heading { padding: 10px 15px; border-bottom: 1px solid transparent; border-top-right-radius: 3px; border-top-left-radius: 3px; } .panel-title { margin-top: 0; margin-bottom: 0; font-size: 16px; } .panel-title > a { color: inherit; } .panel-footer { padding: 10px 15px; background-color: #f5f5f5; border-top: 1px solid #dddddd; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel-group .panel { margin-bottom: 0; overflow: hidden; border-radius: 4px; } .panel-group .panel + .panel { margin-top: 5px; } .panel-group .panel-heading { border-bottom: 0; } .panel-group .panel-heading + .panel-collapse .panel-body { border-top: 1px solid #dddddd; } .panel-group .panel-footer { border-top: 0; } .panel-group .panel-footer + .panel-collapse .panel-body { border-bottom: 1px solid #dddddd; } .panel-default { border-color: #dddddd; } .panel-default > .panel-heading { color: #333333; background-color: #f5f5f5; border-color: #dddddd; } .panel-default > .panel-heading + .panel-collapse .panel-body { border-top-color: #dddddd; } .panel-default > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #dddddd; } .panel-primary { border-color: #428bca; } .panel-primary > .panel-heading { color: #ffffff; background-color: #428bca; border-color: #428bca; } .panel-primary > .panel-heading + .panel-collapse .panel-body { border-top-color: #428bca; } .panel-primary > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #428bca; } .panel-success { border-color: #d6e9c6; } .panel-success > .panel-heading { color: #468847; background-color: #dff0d8; border-color: #d6e9c6; } .panel-success > .panel-heading + .panel-collapse .panel-body { border-top-color: #d6e9c6; } .panel-success > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #d6e9c6; } .panel-warning { border-color: #fbeed5; } .panel-warning > .panel-heading { color: #c09853; background-color: #fcf8e3; border-color: #fbeed5; } .panel-warning > .panel-heading + .panel-collapse .panel-body { border-top-color: #fbeed5; } .panel-warning > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #fbeed5; } .panel-danger { border-color: #eed3d7; } .panel-danger > .panel-heading { color: #b94a48; background-color: #f2dede; border-color: #eed3d7; } .panel-danger > .panel-heading + .panel-collapse .panel-body { border-top-color: #eed3d7; } .panel-danger > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #eed3d7; } .panel-info { border-color: #bce8f1; } .panel-info > .panel-heading { color: #3a87ad; background-color: #d9edf7; border-color: #bce8f1; } .panel-info > .panel-heading + .panel-collapse .panel-body { border-top-color: #bce8f1; } .panel-info > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #bce8f1; } .well { min-height: 20px; padding: 19px; margin-bottom: 20px; background-color: #f5f5f5; border: 1px solid #e3e3e3; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); } .well blockquote { border-color: #ddd; border-color: rgba(0, 0, 0, 0.15); } .well-lg { padding: 24px; border-radius: 6px; } .well-sm { padding: 9px; border-radius: 3px; } .close { float: right; font-size: 21px; font-weight: bold; line-height: 1; color: #000000; text-shadow: 0 1px 0 #ffffff; opacity: 0.2; filter: alpha(opacity=20); } .close:hover, .close:focus { color: #000000; text-decoration: none; cursor: pointer; opacity: 0.5; filter: alpha(opacity=50); } button.close { padding: 0; cursor: pointer; background: transparent; border: 0; -webkit-appearance: none; } .modal-open { overflow: hidden; } body.modal-open, .modal-open .navbar-fixed-top, .modal-open .navbar-fixed-bottom { margin-right: 15px; } .modal { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1040; display: none; overflow: auto; overflow-y: scroll; } .modal.fade .modal-dialog { -webkit-transform: translate(0, -25%); -ms-transform: translate(0, -25%); transform: translate(0, -25%); -webkit-transition: -webkit-transform 0.3s ease-out; -moz-transition: -moz-transform 0.3s ease-out; -o-transition: -o-transform 0.3s ease-out; transition: transform 0.3s ease-out; } .modal.in .modal-dialog { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); transform: translate(0, 0); } .modal-dialog { z-index: 1050; width: auto; padding: 10px; margin-right: auto; margin-left: auto; } .modal-content { position: relative; background-color: #ffffff; border: 1px solid #999999; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; outline: none; -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); background-clip: padding-box; } .modal-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1030; background-color: #000000; } .modal-backdrop.fade { opacity: 0; filter: alpha(opacity=0); } .modal-backdrop.in { opacity: 0.5; filter: alpha(opacity=50); } .modal-header { min-height: 16.428571429px; padding: 15px; border-bottom: 1px solid #e5e5e5; } .modal-header .close { margin-top: -2px; } .modal-title { margin: 0; line-height: 1.428571429; } .modal-body { position: relative; padding: 20px; } .modal-footer { padding: 19px 20px 20px; margin-top: 15px; text-align: right; border-top: 1px solid #e5e5e5; } .modal-footer:before, .modal-footer:after { display: table; content: " "; } .modal-footer:after { clear: both; } .modal-footer:before, .modal-footer:after { display: table; content: " "; } .modal-footer:after { clear: both; } .modal-footer .btn + .btn { margin-bottom: 0; margin-left: 5px; } .modal-footer .btn-group .btn + .btn { margin-left: -1px; } .modal-footer .btn-block + .btn-block { margin-left: 0; } @media screen and (min-width: 768px) { .modal-dialog { right: auto; left: 50%; width: 600px; padding-top: 30px; padding-bottom: 30px; } .modal-content { -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); } } .tooltip { position: absolute; z-index: 1030; display: block; font-size: 12px; line-height: 1.4; opacity: 0; filter: alpha(opacity=0); visibility: visible; } .tooltip.in { opacity: 0.9; filter: alpha(opacity=90); } .tooltip.top { padding: 5px 0; margin-top: -3px; } .tooltip.right { padding: 0 5px; margin-left: 3px; } .tooltip.bottom { padding: 5px 0; margin-top: 3px; } .tooltip.left { padding: 0 5px; margin-left: -3px; } .tooltip-inner { max-width: 200px; padding: 3px 8px; color: #ffffff; text-align: center; text-decoration: none; background-color: #000000; border-radius: 4px; } .tooltip-arrow { position: absolute; width: 0; height: 0; border-color: transparent; border-style: solid; } .tooltip.top .tooltip-arrow { bottom: 0; left: 50%; margin-left: -5px; border-top-color: #000000; border-width: 5px 5px 0; } .tooltip.top-left .tooltip-arrow { bottom: 0; left: 5px; border-top-color: #000000; border-width: 5px 5px 0; } .tooltip.top-right .tooltip-arrow { right: 5px; bottom: 0; border-top-color: #000000; border-width: 5px 5px 0; } .tooltip.right .tooltip-arrow { top: 50%; left: 0; margin-top: -5px; border-right-color: #000000; border-width: 5px 5px 5px 0; } .tooltip.left .tooltip-arrow { top: 50%; right: 0; margin-top: -5px; border-left-color: #000000; border-width: 5px 0 5px 5px; } .tooltip.bottom .tooltip-arrow { top: 0; left: 50%; margin-left: -5px; border-bottom-color: #000000; border-width: 0 5px 5px; } .tooltip.bottom-left .tooltip-arrow { top: 0; left: 5px; border-bottom-color: #000000; border-width: 0 5px 5px; } .tooltip.bottom-right .tooltip-arrow { top: 0; right: 5px; border-bottom-color: #000000; border-width: 0 5px 5px; } .popover { position: absolute; top: 0; left: 0; z-index: 1010; display: none; max-width: 276px; padding: 1px; text-align: left; white-space: normal; background-color: #ffffff; border: 1px solid #cccccc; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); background-clip: padding-box; } .popover.top { margin-top: -10px; } .popover.right { margin-left: 10px; } .popover.bottom { margin-top: 10px; } .popover.left { margin-left: -10px; } .popover-title { padding: 8px 14px; margin: 0; font-size: 14px; font-weight: normal; line-height: 18px; background-color: #f7f7f7; border-bottom: 1px solid #ebebeb; border-radius: 5px 5px 0 0; } .popover-content { padding: 9px 14px; } .popover .arrow, .popover .arrow:after { position: absolute; display: block; width: 0; height: 0; border-color: transparent; border-style: solid; } .popover .arrow { border-width: 11px; } .popover .arrow:after { border-width: 10px; content: ""; } .popover.top .arrow { bottom: -11px; left: 50%; margin-left: -11px; border-top-color: #999999; border-top-color: rgba(0, 0, 0, 0.25); border-bottom-width: 0; } .popover.top .arrow:after { bottom: 1px; margin-left: -10px; border-top-color: #ffffff; border-bottom-width: 0; content: " "; } .popover.right .arrow { top: 50%; left: -11px; margin-top: -11px; border-right-color: #999999; border-right-color: rgba(0, 0, 0, 0.25); border-left-width: 0; } .popover.right .arrow:after { bottom: -10px; left: 1px; border-right-color: #ffffff; border-left-width: 0; content: " "; } .popover.bottom .arrow { top: -11px; left: 50%; margin-left: -11px; border-bottom-color: #999999; border-bottom-color: rgba(0, 0, 0, 0.25); border-top-width: 0; } .popover.bottom .arrow:after { top: 1px; margin-left: -10px; border-bottom-color: #ffffff; border-top-width: 0; content: " "; } .popover.left .arrow { top: 50%; right: -11px; margin-top: -11px; border-left-color: #999999; border-left-color: rgba(0, 0, 0, 0.25); border-right-width: 0; } .popover.left .arrow:after { right: 1px; bottom: -10px; border-left-color: #ffffff; border-right-width: 0; content: " "; } .carousel { position: relative; } .carousel-inner { position: relative; width: 100%; overflow: hidden; } .carousel-inner > .item { position: relative; display: none; -webkit-transition: 0.6s ease-in-out left; transition: 0.6s ease-in-out left; } .carousel-inner > .item > img, .carousel-inner > .item > a > img { display: block; height: auto; max-width: 100%; line-height: 1; } .carousel-inner > .active, .carousel-inner > .next, .carousel-inner > .prev { display: block; } .carousel-inner > .active { left: 0; } .carousel-inner > .next, .carousel-inner > .prev { position: absolute; top: 0; width: 100%; } .carousel-inner > .next { left: 100%; } .carousel-inner > .prev { left: -100%; } .carousel-inner > .next.left, .carousel-inner > .prev.right { left: 0; } .carousel-inner > .active.left { left: -100%; } .carousel-inner > .active.right { left: 100%; } .carousel-control { position: absolute; top: 0; bottom: 0; left: 0; width: 15%; font-size: 20px; color: #ffffff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); opacity: 0.5; filter: alpha(opacity=50); } .carousel-control.left { background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001))); background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%)); background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%); background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); } .carousel-control.right { right: 0; left: auto; background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5))); background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%)); background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%); background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); } .carousel-control:hover, .carousel-control:focus { color: #ffffff; text-decoration: none; opacity: 0.9; filter: alpha(opacity=90); } .carousel-control .icon-prev, .carousel-control .icon-next, .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right { position: absolute; top: 50%; left: 50%; z-index: 5; display: inline-block; } .carousel-control .icon-prev, .carousel-control .icon-next { width: 20px; height: 20px; margin-top: -10px; margin-left: -10px; font-family: serif; } .carousel-control .icon-prev:before { content: '\2039'; } .carousel-control .icon-next:before { content: '\203a'; } .carousel-indicators { position: absolute; bottom: 10px; left: 50%; z-index: 15; width: 60%; padding-left: 0; margin-left: -30%; text-align: center; list-style: none; } .carousel-indicators li { display: inline-block; width: 10px; height: 10px; margin: 1px; text-indent: -999px; cursor: pointer; border: 1px solid #ffffff; border-radius: 10px; } .carousel-indicators .active { width: 12px; height: 12px; margin: 0; background-color: #ffffff; } .carousel-caption { position: absolute; right: 15%; bottom: 20px; left: 15%; z-index: 10; padding-top: 20px; padding-bottom: 20px; color: #ffffff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); } .carousel-caption .btn { text-shadow: none; } @media screen and (min-width: 768px) { .carousel-control .icon-prev, .carousel-control .icon-next { width: 30px; height: 30px; margin-top: -15px; margin-left: -15px; font-size: 30px; } .carousel-caption { right: 20%; left: 20%; padding-bottom: 30px; } .carousel-indicators { bottom: 20px; } } .clearfix:before, .clearfix:after { display: table; content: " "; } .clearfix:after { clear: both; } .pull-right { float: right !important; } .pull-left { float: left !important; } .hide { display: none !important; } .show { display: block !important; } .invisible { visibility: hidden; } .text-hide { font: 0/0 a; color: transparent; text-shadow: none; background-color: transparent; border: 0; } .affix { position: fixed; } @-ms-viewport { width: device-width; } @media screen and (max-width: 400px) { @-ms-viewport { width: 320px; } } .hidden { display: none !important; visibility: hidden !important; } .visible-xs { display: none !important; } tr.visible-xs { display: none !important; } th.visible-xs, td.visible-xs { display: none !important; } @media (max-width: 767px) { .visible-xs { display: block !important; } tr.visible-xs { display: table-row !important; } th.visible-xs, td.visible-xs { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-xs.visible-sm { display: block !important; } tr.visible-xs.visible-sm { display: table-row !important; } th.visible-xs.visible-sm, td.visible-xs.visible-sm { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-xs.visible-md { display: block !important; } tr.visible-xs.visible-md { display: table-row !important; } th.visible-xs.visible-md, td.visible-xs.visible-md { display: table-cell !important; } } @media (min-width: 1200px) { .visible-xs.visible-lg { display: block !important; } tr.visible-xs.visible-lg { display: table-row !important; } th.visible-xs.visible-lg, td.visible-xs.visible-lg { display: table-cell !important; } } .visible-sm { display: none !important; } tr.visible-sm { display: none !important; } th.visible-sm, td.visible-sm { display: none !important; } @media (max-width: 767px) { .visible-sm.visible-xs { display: block !important; } tr.visible-sm.visible-xs { display: table-row !important; } th.visible-sm.visible-xs, td.visible-sm.visible-xs { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm { display: block !important; } tr.visible-sm { display: table-row !important; } th.visible-sm, td.visible-sm { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-sm.visible-md { display: block !important; } tr.visible-sm.visible-md { display: table-row !important; } th.visible-sm.visible-md, td.visible-sm.visible-md { display: table-cell !important; } } @media (min-width: 1200px) { .visible-sm.visible-lg { display: block !important; } tr.visible-sm.visible-lg { display: table-row !important; } th.visible-sm.visible-lg, td.visible-sm.visible-lg { display: table-cell !important; } } .visible-md { display: none !important; } tr.visible-md { display: none !important; } th.visible-md, td.visible-md { display: none !important; } @media (max-width: 767px) { .visible-md.visible-xs { display: block !important; } tr.visible-md.visible-xs { display: table-row !important; } th.visible-md.visible-xs, td.visible-md.visible-xs { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-md.visible-sm { display: block !important; } tr.visible-md.visible-sm { display: table-row !important; } th.visible-md.visible-sm, td.visible-md.visible-sm { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md { display: block !important; } tr.visible-md { display: table-row !important; } th.visible-md, td.visible-md { display: table-cell !important; } } @media (min-width: 1200px) { .visible-md.visible-lg { display: block !important; } tr.visible-md.visible-lg { display: table-row !important; } th.visible-md.visible-lg, td.visible-md.visible-lg { display: table-cell !important; } } .visible-lg { display: none !important; } tr.visible-lg { display: none !important; } th.visible-lg, td.visible-lg { display: none !important; } @media (max-width: 767px) { .visible-lg.visible-xs { display: block !important; } tr.visible-lg.visible-xs { display: table-row !important; } th.visible-lg.visible-xs, td.visible-lg.visible-xs { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-lg.visible-sm { display: block !important; } tr.visible-lg.visible-sm { display: table-row !important; } th.visible-lg.visible-sm, td.visible-lg.visible-sm { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-lg.visible-md { display: block !important; } tr.visible-lg.visible-md { display: table-row !important; } th.visible-lg.visible-md, td.visible-lg.visible-md { display: table-cell !important; } } @media (min-width: 1200px) { .visible-lg { display: block !important; } tr.visible-lg { display: table-row !important; } th.visible-lg, td.visible-lg { display: table-cell !important; } } .hidden-xs { display: block !important; } tr.hidden-xs { display: table-row !important; } th.hidden-xs, td.hidden-xs { display: table-cell !important; } @media (max-width: 767px) { .hidden-xs { display: none !important; } tr.hidden-xs { display: none !important; } th.hidden-xs, td.hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-xs.hidden-sm { display: none !important; } tr.hidden-xs.hidden-sm { display: none !important; } th.hidden-xs.hidden-sm, td.hidden-xs.hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-xs.hidden-md { display: none !important; } tr.hidden-xs.hidden-md { display: none !important; } th.hidden-xs.hidden-md, td.hidden-xs.hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-xs.hidden-lg { display: none !important; } tr.hidden-xs.hidden-lg { display: none !important; } th.hidden-xs.hidden-lg, td.hidden-xs.hidden-lg { display: none !important; } } .hidden-sm { display: block !important; } tr.hidden-sm { display: table-row !important; } th.hidden-sm, td.hidden-sm { display: table-cell !important; } @media (max-width: 767px) { .hidden-sm.hidden-xs { display: none !important; } tr.hidden-sm.hidden-xs { display: none !important; } th.hidden-sm.hidden-xs, td.hidden-sm.hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-sm { display: none !important; } tr.hidden-sm { display: none !important; } th.hidden-sm, td.hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-sm.hidden-md { display: none !important; } tr.hidden-sm.hidden-md { display: none !important; } th.hidden-sm.hidden-md, td.hidden-sm.hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-sm.hidden-lg { display: none !important; } tr.hidden-sm.hidden-lg { display: none !important; } th.hidden-sm.hidden-lg, td.hidden-sm.hidden-lg { display: none !important; } } .hidden-md { display: block !important; } tr.hidden-md { display: table-row !important; } th.hidden-md, td.hidden-md { display: table-cell !important; } @media (max-width: 767px) { .hidden-md.hidden-xs { display: none !important; } tr.hidden-md.hidden-xs { display: none !important; } th.hidden-md.hidden-xs, td.hidden-md.hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-md.hidden-sm { display: none !important; } tr.hidden-md.hidden-sm { display: none !important; } th.hidden-md.hidden-sm, td.hidden-md.hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-md { display: none !important; } tr.hidden-md { display: none !important; } th.hidden-md, td.hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-md.hidden-lg { display: none !important; } tr.hidden-md.hidden-lg { display: none !important; } th.hidden-md.hidden-lg, td.hidden-md.hidden-lg { display: none !important; } } .hidden-lg { display: block !important; } tr.hidden-lg { display: table-row !important; } th.hidden-lg, td.hidden-lg { display: table-cell !important; } @media (max-width: 767px) { .hidden-lg.hidden-xs { display: none !important; } tr.hidden-lg.hidden-xs { display: none !important; } th.hidden-lg.hidden-xs, td.hidden-lg.hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-lg.hidden-sm { display: none !important; } tr.hidden-lg.hidden-sm { display: none !important; } th.hidden-lg.hidden-sm, td.hidden-lg.hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-lg.hidden-md { display: none !important; } tr.hidden-lg.hidden-md { display: none !important; } th.hidden-lg.hidden-md, td.hidden-lg.hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-lg { display: none !important; } tr.hidden-lg { display: none !important; } th.hidden-lg, td.hidden-lg { display: none !important; } } .visible-print { display: none !important; } tr.visible-print { display: none !important; } th.visible-print, td.visible-print { display: none !important; } @media print { .visible-print { display: block !important; } tr.visible-print { display: table-row !important; } th.visible-print, td.visible-print { display: table-cell !important; } .hidden-print { display: none !important; } tr.hidden-print { display: none !important; } th.hidden-print, td.hidden-print { display: none !important; } } ================================================ FILE: Chapters/DevEnv/Dependency/Game/WebApplication/Controllers/AccountController.cs ================================================ using System; using System.Globalization; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; using System.Web; using System.Web.Mvc; using Microsoft.AspNet.Identity; using Microsoft.AspNet.Identity.Owin; using Microsoft.Owin.Security; using WebApplication.Models; namespace WebApplication.Controllers { [Authorize] public class AccountController : Controller { private ApplicationSignInManager _signInManager; private ApplicationUserManager _userManager; public AccountController() { } public AccountController(ApplicationUserManager userManager, ApplicationSignInManager signInManager ) { UserManager = userManager; SignInManager = signInManager; } public ApplicationSignInManager SignInManager { get { return _signInManager ?? HttpContext.GetOwinContext().Get(); } private set { _signInManager = value; } } public ApplicationUserManager UserManager { get { return _userManager ?? HttpContext.GetOwinContext().GetUserManager(); } private set { _userManager = value; } } // // GET: /Account/Login [AllowAnonymous] public ActionResult Login(string returnUrl) { ViewBag.ReturnUrl = returnUrl; return View(); } // // POST: /Account/Login [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task Login(LoginViewModel model, string returnUrl) { if (!ModelState.IsValid) { return View(model); } // これは、アカウント ロックアウトの基準となるログイン失敗回数を数えません。 // パスワード入力失敗回数に基づいてアカウントがロックアウトされるように設定するには、shouldLockout: true に変更してください。 var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false); switch (result) { case SignInStatus.Success: return RedirectToLocal(returnUrl); case SignInStatus.LockedOut: return View("Lockout"); case SignInStatus.RequiresVerification: return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe }); case SignInStatus.Failure: default: ModelState.AddModelError("", "無効なログイン試行です。"); return View(model); } } // // GET: /Account/VerifyCode [AllowAnonymous] public async Task VerifyCode(string provider, string returnUrl, bool rememberMe) { // ユーザーがユーザー名/パスワードまたは外部ログイン経由でログイン済みであることが必要です。 if (!await SignInManager.HasBeenVerifiedAsync()) { return View("Error"); } return View(new VerifyCodeViewModel { Provider = provider, ReturnUrl = returnUrl, RememberMe = rememberMe }); } // // POST: /Account/VerifyCode [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task VerifyCode(VerifyCodeViewModel model) { if (!ModelState.IsValid) { return View(model); } // 次のコードは、2 要素コードに対するブルート フォース攻撃を防ぎます。 // ユーザーが誤ったコードを入力した回数が指定の回数に達すると、ユーザー アカウントは // 指定の時間が経過するまでロックアウトされます。 // アカウント ロックアウトの設定は IdentityConfig の中で構成できます。 var result = await SignInManager.TwoFactorSignInAsync(model.Provider, model.Code, isPersistent: model.RememberMe, rememberBrowser: model.RememberBrowser); switch (result) { case SignInStatus.Success: return RedirectToLocal(model.ReturnUrl); case SignInStatus.LockedOut: return View("Lockout"); case SignInStatus.Failure: default: ModelState.AddModelError("", "無効なコード。"); return View(model); } } // // GET: /Account/Register [AllowAnonymous] public ActionResult Register() { return View(); } // // POST: /Account/Register [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task Register(RegisterViewModel model) { if (ModelState.IsValid) { var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; var result = await UserManager.CreateAsync(user, model.Password); if (result.Succeeded) { await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false); // アカウント確認とパスワード リセットを有効にする方法の詳細については、http://go.microsoft.com/fwlink/?LinkID=320771 を参照してください // このリンクを含む電子メールを送信します // string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id); // var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme); // await UserManager.SendEmailAsync(user.Id, "アカウントの確認", "このリンクをクリックすることによってアカウントを確認してください こちら"); return RedirectToAction("Index", "Home"); } AddErrors(result); } // ここで問題が発生した場合はフォームを再表示します return View(model); } // // GET: /Account/ConfirmEmail [AllowAnonymous] public async Task ConfirmEmail(string userId, string code) { if (userId == null || code == null) { return View("Error"); } var result = await UserManager.ConfirmEmailAsync(userId, code); return View(result.Succeeded ? "ConfirmEmail" : "Error"); } // // GET: /Account/ForgotPassword [AllowAnonymous] public ActionResult ForgotPassword() { return View(); } // // POST: /Account/ForgotPassword [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task ForgotPassword(ForgotPasswordViewModel model) { if (ModelState.IsValid) { var user = await UserManager.FindByNameAsync(model.Email); if (user == null || !(await UserManager.IsEmailConfirmedAsync(user.Id))) { // ユーザーが存在しないことや未確認であることを公開しません。 return View("ForgotPasswordConfirmation"); } // アカウント確認とパスワード リセットを有効にする方法の詳細については、http://go.microsoft.com/fwlink/?LinkID=320771 を参照してください // このリンクを含む電子メールを送信します // string code = await UserManager.GeneratePasswordResetTokenAsync(user.Id); // var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme); // await UserManager.SendEmailAsync(user.Id, "パスワード", "のリセット こちら をクリックして、パスワードをリセットしてください"); // return RedirectToAction("ForgotPasswordConfirmation", "Account"); } // ここで問題が発生した場合はフォームを再表示します return View(model); } // // GET: /Account/ForgotPasswordConfirmation [AllowAnonymous] public ActionResult ForgotPasswordConfirmation() { return View(); } // // GET: /Account/ResetPassword [AllowAnonymous] public ActionResult ResetPassword(string code) { return code == null ? View("Error") : View(); } // // POST: /Account/ResetPassword [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task ResetPassword(ResetPasswordViewModel model) { if (!ModelState.IsValid) { return View(model); } var user = await UserManager.FindByNameAsync(model.Email); if (user == null) { // ユーザーが存在しないことを公開しません。 return RedirectToAction("ResetPasswordConfirmation", "Account"); } var result = await UserManager.ResetPasswordAsync(user.Id, model.Code, model.Password); if (result.Succeeded) { return RedirectToAction("ResetPasswordConfirmation", "Account"); } AddErrors(result); return View(); } // // GET: /Account/ResetPasswordConfirmation [AllowAnonymous] public ActionResult ResetPasswordConfirmation() { return View(); } // // POST: /Account/ExternalLogin [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public ActionResult ExternalLogin(string provider, string returnUrl) { // 外部ログイン プロバイダーへのリダイレクトを要求します return new ChallengeResult(provider, Url.Action("ExternalLoginCallback", "Account", new { ReturnUrl = returnUrl })); } // // GET: /Account/SendCode [AllowAnonymous] public async Task SendCode(string returnUrl, bool rememberMe) { var userId = await SignInManager.GetVerifiedUserIdAsync(); if (userId == null) { return View("Error"); } var userFactors = await UserManager.GetValidTwoFactorProvidersAsync(userId); var factorOptions = userFactors.Select(purpose => new SelectListItem { Text = purpose, Value = purpose }).ToList(); return View(new SendCodeViewModel { Providers = factorOptions, ReturnUrl = returnUrl, RememberMe = rememberMe }); } // // POST: /Account/SendCode [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task SendCode(SendCodeViewModel model) { if (!ModelState.IsValid) { return View(); } // トークンを生成して送信します。 if (!await SignInManager.SendTwoFactorCodeAsync(model.SelectedProvider)) { return View("Error"); } return RedirectToAction("VerifyCode", new { Provider = model.SelectedProvider, ReturnUrl = model.ReturnUrl, RememberMe = model.RememberMe }); } // // GET: /Account/ExternalLoginCallback [AllowAnonymous] public async Task ExternalLoginCallback(string returnUrl) { var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); if (loginInfo == null) { return RedirectToAction("Login"); } // ユーザーが既にログインを持っている場合、この外部ログイン プロバイダーを使用してユーザーをサインインします var result = await SignInManager.ExternalSignInAsync(loginInfo, isPersistent: false); switch (result) { case SignInStatus.Success: return RedirectToLocal(returnUrl); case SignInStatus.LockedOut: return View("Lockout"); case SignInStatus.RequiresVerification: return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = false }); case SignInStatus.Failure: default: // ユーザーがアカウントを持っていない場合、ユーザーにアカウントを作成するよう求めます ViewBag.ReturnUrl = returnUrl; ViewBag.LoginProvider = loginInfo.Login.LoginProvider; return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { Email = loginInfo.Email }); } } // // POST: /Account/ExternalLoginConfirmation [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task ExternalLoginConfirmation(ExternalLoginConfirmationViewModel model, string returnUrl) { if (User.Identity.IsAuthenticated) { return RedirectToAction("Index", "Manage"); } if (ModelState.IsValid) { // 外部ログイン プロバイダーからユーザーに関する情報を取得します var info = await AuthenticationManager.GetExternalLoginInfoAsync(); if (info == null) { return View("ExternalLoginFailure"); } var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; var result = await UserManager.CreateAsync(user); if (result.Succeeded) { result = await UserManager.AddLoginAsync(user.Id, info.Login); if (result.Succeeded) { await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false); return RedirectToLocal(returnUrl); } } AddErrors(result); } ViewBag.ReturnUrl = returnUrl; return View(model); } // // POST: /Account/LogOff [HttpPost] [ValidateAntiForgeryToken] public ActionResult LogOff() { AuthenticationManager.SignOut(); return RedirectToAction("Index", "Home"); } // // GET: /Account/ExternalLoginFailure [AllowAnonymous] public ActionResult ExternalLoginFailure() { return View(); } protected override void Dispose(bool disposing) { if (disposing) { if (_userManager != null) { _userManager.Dispose(); _userManager = null; } if (_signInManager != null) { _signInManager.Dispose(); _signInManager = null; } } base.Dispose(disposing); } #region ヘルパー // 外部ログインの追加時に XSRF の防止に使用します private const string XsrfKey = "XsrfId"; private IAuthenticationManager AuthenticationManager { get { return HttpContext.GetOwinContext().Authentication; } } private void AddErrors(IdentityResult result) { foreach (var error in result.Errors) { ModelState.AddModelError("", error); } } private ActionResult RedirectToLocal(string returnUrl) { if (Url.IsLocalUrl(returnUrl)) { return Redirect(returnUrl); } return RedirectToAction("Index", "Home"); } internal class ChallengeResult : HttpUnauthorizedResult { public ChallengeResult(string provider, string redirectUri) : this(provider, redirectUri, null) { } public ChallengeResult(string provider, string redirectUri, string userId) { LoginProvider = provider; RedirectUri = redirectUri; UserId = userId; } public string LoginProvider { get; set; } public string RedirectUri { get; set; } public string UserId { get; set; } public override void ExecuteResult(ControllerContext context) { var properties = new AuthenticationProperties { RedirectUri = RedirectUri }; if (UserId != null) { properties.Dictionary[XsrfKey] = UserId; } context.HttpContext.GetOwinContext().Authentication.Challenge(properties, LoginProvider); } } #endregion } } ================================================ FILE: Chapters/DevEnv/Dependency/Game/WebApplication/Controllers/HomeController.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace WebApplication.Controllers { public class HomeController : Controller { public ActionResult Index() { return View(); } public ActionResult About() { ViewBag.Message = "Your application description page."; return View(); } public ActionResult Contact() { ViewBag.Message = "Your contact page."; return View(); } } } ================================================ FILE: Chapters/DevEnv/Dependency/Game/WebApplication/Controllers/ManageController.cs ================================================ using System; using System.Linq; using System.Threading.Tasks; using System.Web; using System.Web.Mvc; using Microsoft.AspNet.Identity; using Microsoft.AspNet.Identity.Owin; using Microsoft.Owin.Security; using WebApplication.Models; namespace WebApplication.Controllers { [Authorize] public class ManageController : Controller { private ApplicationSignInManager _signInManager; private ApplicationUserManager _userManager; public ManageController() { } public ManageController(ApplicationUserManager userManager, ApplicationSignInManager signInManager) { UserManager = userManager; SignInManager = signInManager; } public ApplicationSignInManager SignInManager { get { return _signInManager ?? HttpContext.GetOwinContext().Get(); } private set { _signInManager = value; } } public ApplicationUserManager UserManager { get { return _userManager ?? HttpContext.GetOwinContext().GetUserManager(); } private set { _userManager = value; } } // // GET: /Manage/Index public async Task Index(ManageMessageId? message) { ViewBag.StatusMessage = message == ManageMessageId.ChangePasswordSuccess ? "パスワードが変更されました。" : message == ManageMessageId.SetPasswordSuccess ? "パスワードが設定されました。" : message == ManageMessageId.SetTwoFactorSuccess ? "2 要素認証プロバイダーが設定されました。" : message == ManageMessageId.Error ? "エラーが発生しました。" : message == ManageMessageId.AddPhoneSuccess ? "電話番号が追加されました。" : message == ManageMessageId.RemovePhoneSuccess ? "電話番号が削除されました。" : ""; var userId = User.Identity.GetUserId(); var model = new IndexViewModel { HasPassword = HasPassword(), PhoneNumber = await UserManager.GetPhoneNumberAsync(userId), TwoFactor = await UserManager.GetTwoFactorEnabledAsync(userId), Logins = await UserManager.GetLoginsAsync(userId), BrowserRemembered = await AuthenticationManager.TwoFactorBrowserRememberedAsync(userId) }; return View(model); } // // POST: /Manage/RemoveLogin [HttpPost] [ValidateAntiForgeryToken] public async Task RemoveLogin(string loginProvider, string providerKey) { ManageMessageId? message; var result = await UserManager.RemoveLoginAsync(User.Identity.GetUserId(), new UserLoginInfo(loginProvider, providerKey)); if (result.Succeeded) { var user = await UserManager.FindByIdAsync(User.Identity.GetUserId()); if (user != null) { await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false); } message = ManageMessageId.RemoveLoginSuccess; } else { message = ManageMessageId.Error; } return RedirectToAction("ManageLogins", new { Message = message }); } // // GET: /Manage/AddPhoneNumber public ActionResult AddPhoneNumber() { return View(); } // // POST: /Manage/AddPhoneNumber [HttpPost] [ValidateAntiForgeryToken] public async Task AddPhoneNumber(AddPhoneNumberViewModel model) { if (!ModelState.IsValid) { return View(model); } // トークンを生成して送信します。 var code = await UserManager.GenerateChangePhoneNumberTokenAsync(User.Identity.GetUserId(), model.Number); if (UserManager.SmsService != null) { var message = new IdentityMessage { Destination = model.Number, Body = "あなたのセキュリティ コード: " + code }; await UserManager.SmsService.SendAsync(message); } return RedirectToAction("VerifyPhoneNumber", new { PhoneNumber = model.Number }); } // // POST: /Manage/EnableTwoFactorAuthentication [HttpPost] [ValidateAntiForgeryToken] public async Task EnableTwoFactorAuthentication() { await UserManager.SetTwoFactorEnabledAsync(User.Identity.GetUserId(), true); var user = await UserManager.FindByIdAsync(User.Identity.GetUserId()); if (user != null) { await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false); } return RedirectToAction("Index", "Manage"); } // // POST: /Manage/DisableTwoFactorAuthentication [HttpPost] [ValidateAntiForgeryToken] public async Task DisableTwoFactorAuthentication() { await UserManager.SetTwoFactorEnabledAsync(User.Identity.GetUserId(), false); var user = await UserManager.FindByIdAsync(User.Identity.GetUserId()); if (user != null) { await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false); } return RedirectToAction("Index", "Manage"); } // // GET: /Manage/VerifyPhoneNumber public async Task VerifyPhoneNumber(string phoneNumber) { var code = await UserManager.GenerateChangePhoneNumberTokenAsync(User.Identity.GetUserId(), phoneNumber); // 電話番号を確認するために SMS プロバイダー経由で SMS を送信します。 return phoneNumber == null ? View("Error") : View(new VerifyPhoneNumberViewModel { PhoneNumber = phoneNumber }); } // // POST: /Manage/VerifyPhoneNumber [HttpPost] [ValidateAntiForgeryToken] public async Task VerifyPhoneNumber(VerifyPhoneNumberViewModel model) { if (!ModelState.IsValid) { return View(model); } var result = await UserManager.ChangePhoneNumberAsync(User.Identity.GetUserId(), model.PhoneNumber, model.Code); if (result.Succeeded) { var user = await UserManager.FindByIdAsync(User.Identity.GetUserId()); if (user != null) { await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false); } return RedirectToAction("Index", new { Message = ManageMessageId.AddPhoneSuccess }); } // ここに到達した場合は何らかの問題が発生しているので、フォームを再表示します。 ModelState.AddModelError("", "電話番号を確認できませんでした"); return View(model); } // // GET: /Manage/RemovePhoneNumber public async Task RemovePhoneNumber() { var result = await UserManager.SetPhoneNumberAsync(User.Identity.GetUserId(), null); if (!result.Succeeded) { return RedirectToAction("Index", new { Message = ManageMessageId.Error }); } var user = await UserManager.FindByIdAsync(User.Identity.GetUserId()); if (user != null) { await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false); } return RedirectToAction("Index", new { Message = ManageMessageId.RemovePhoneSuccess }); } // // GET: /Manage/ChangePassword public ActionResult ChangePassword() { return View(); } // // POST: /Manage/ChangePassword [HttpPost] [ValidateAntiForgeryToken] public async Task ChangePassword(ChangePasswordViewModel model) { if (!ModelState.IsValid) { return View(model); } var result = await UserManager.ChangePasswordAsync(User.Identity.GetUserId(), model.OldPassword, model.NewPassword); if (result.Succeeded) { var user = await UserManager.FindByIdAsync(User.Identity.GetUserId()); if (user != null) { await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false); } return RedirectToAction("Index", new { Message = ManageMessageId.ChangePasswordSuccess }); } AddErrors(result); return View(model); } // // GET: /Manage/SetPassword public ActionResult SetPassword() { return View(); } // // POST: /Manage/SetPassword [HttpPost] [ValidateAntiForgeryToken] public async Task SetPassword(SetPasswordViewModel model) { if (ModelState.IsValid) { var result = await UserManager.AddPasswordAsync(User.Identity.GetUserId(), model.NewPassword); if (result.Succeeded) { var user = await UserManager.FindByIdAsync(User.Identity.GetUserId()); if (user != null) { await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false); } return RedirectToAction("Index", new { Message = ManageMessageId.SetPasswordSuccess }); } AddErrors(result); } // ここに到達した場合は何らかの問題が発生しているので、フォームを再表示します。 return View(model); } // // GET: /Manage/ManageLogins public async Task ManageLogins(ManageMessageId? message) { ViewBag.StatusMessage = message == ManageMessageId.RemoveLoginSuccess ? "外部ログインが削除されました。" : message == ManageMessageId.Error ? "エラーが発生しました。" : ""; var user = await UserManager.FindByIdAsync(User.Identity.GetUserId()); if (user == null) { return View("Error"); } var userLogins = await UserManager.GetLoginsAsync(User.Identity.GetUserId()); var otherLogins = AuthenticationManager.GetExternalAuthenticationTypes().Where(auth => userLogins.All(ul => auth.AuthenticationType != ul.LoginProvider)).ToList(); ViewBag.ShowRemoveButton = user.PasswordHash != null || userLogins.Count > 1; return View(new ManageLoginsViewModel { CurrentLogins = userLogins, OtherLogins = otherLogins }); } // // POST: /Manage/LinkLogin [HttpPost] [ValidateAntiForgeryToken] public ActionResult LinkLogin(string provider) { // 現在のユーザーのログインをリンクするために外部ログイン プロバイダーへのリダイレクトを要求します。 return new AccountController.ChallengeResult(provider, Url.Action("LinkLoginCallback", "Manage"), User.Identity.GetUserId()); } // // GET: /Manage/LinkLoginCallback public async Task LinkLoginCallback() { var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(XsrfKey, User.Identity.GetUserId()); if (loginInfo == null) { return RedirectToAction("ManageLogins", new { Message = ManageMessageId.Error }); } var result = await UserManager.AddLoginAsync(User.Identity.GetUserId(), loginInfo.Login); return result.Succeeded ? RedirectToAction("ManageLogins") : RedirectToAction("ManageLogins", new { Message = ManageMessageId.Error }); } protected override void Dispose(bool disposing) { if (disposing && _userManager != null) { _userManager.Dispose(); _userManager = null; } base.Dispose(disposing); } #region ヘルパー // 外部ログインの追加時に XSRF の防止に使用します private const string XsrfKey = "XsrfId"; private IAuthenticationManager AuthenticationManager { get { return HttpContext.GetOwinContext().Authentication; } } private void AddErrors(IdentityResult result) { foreach (var error in result.Errors) { ModelState.AddModelError("", error); } } private bool HasPassword() { var user = UserManager.FindById(User.Identity.GetUserId()); if (user != null) { return user.PasswordHash != null; } return false; } private bool HasPhoneNumber() { var user = UserManager.FindById(User.Identity.GetUserId()); if (user != null) { return user.PhoneNumber != null; } return false; } public enum ManageMessageId { AddPhoneSuccess, ChangePasswordSuccess, SetTwoFactorSuccess, SetPasswordSuccess, RemoveLoginSuccess, RemovePhoneSuccess, Error } #endregion } } ================================================ FILE: Chapters/DevEnv/Dependency/Game/WebApplication/Global.asax ================================================ <%@ Application Codebehind="Global.asax.cs" Inherits="WebApplication.MvcApplication" Language="C#" %> ================================================ FILE: Chapters/DevEnv/Dependency/Game/WebApplication/Global.asax.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Optimization; using System.Web.Routing; namespace WebApplication { public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); } } } ================================================ FILE: Chapters/DevEnv/Dependency/Game/WebApplication/Models/AccountViewModels.cs ================================================ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; namespace WebApplication.Models { public class ExternalLoginConfirmationViewModel { [Required] [Display(Name = "電子メール")] public string Email { get; set; } } public class ExternalLoginListViewModel { public string ReturnUrl { get; set; } } public class SendCodeViewModel { public string SelectedProvider { get; set; } public ICollection Providers { get; set; } public string ReturnUrl { get; set; } public bool RememberMe { get; set; } } public class VerifyCodeViewModel { [Required] public string Provider { get; set; } [Required] [Display(Name = "コード")] public string Code { get; set; } public string ReturnUrl { get; set; } [Display(Name = "認証情報をこのブラウザーに保存しますか?")] public bool RememberBrowser { get; set; } public bool RememberMe { get; set; } } public class ForgotViewModel { [Required] [Display(Name = "電子メール")] public string Email { get; set; } } public class LoginViewModel { [Required] [Display(Name = "電子メール")] [EmailAddress] public string Email { get; set; } [Required] [DataType(DataType.Password)] [Display(Name = "パスワード")] public string Password { get; set; } [Display(Name = "このアカウントを記憶する")] public bool RememberMe { get; set; } } public class RegisterViewModel { [Required] [EmailAddress] [Display(Name = "電子メール")] public string Email { get; set; } [Required] [StringLength(100, ErrorMessage = "{0} の長さは {2} 文字以上である必要があります。", MinimumLength = 6)] [DataType(DataType.Password)] [Display(Name = "パスワード")] public string Password { get; set; } [DataType(DataType.Password)] [Display(Name = "パスワードの確認入力")] [Compare("Password", ErrorMessage = "パスワードと確認のパスワードが一致しません。")] public string ConfirmPassword { get; set; } } public class ResetPasswordViewModel { [Required] [EmailAddress] [Display(Name = "電子メール")] public string Email { get; set; } [Required] [StringLength(100, ErrorMessage = "{0} の長さは {2} 文字以上である必要があります。", MinimumLength = 6)] [DataType(DataType.Password)] [Display(Name = "パスワード")] public string Password { get; set; } [DataType(DataType.Password)] [Display(Name = "パスワードの確認入力")] [Compare("Password", ErrorMessage = "パスワードと確認のパスワードが一致しません。")] public string ConfirmPassword { get; set; } public string Code { get; set; } } public class ForgotPasswordViewModel { [Required] [EmailAddress] [Display(Name = "電子メール")] public string Email { get; set; } } } ================================================ FILE: Chapters/DevEnv/Dependency/Game/WebApplication/Models/IdentityModels.cs ================================================ using System.Data.Entity; using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNet.Identity; using Microsoft.AspNet.Identity.EntityFramework; namespace WebApplication.Models { // ApplicationUser クラスにプロパティを追加することでユーザーのプロファイル データを追加できます。詳細については、http://go.microsoft.com/fwlink/?LinkID=317594 を参照してください。 public class ApplicationUser : IdentityUser { public async Task GenerateUserIdentityAsync(UserManager manager) { // authenticationType が CookieAuthenticationOptions.AuthenticationType で定義されているものと一致している必要があります var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); // ここにカスタム ユーザー クレームを追加します return userIdentity; } } public class ApplicationDbContext : IdentityDbContext { public ApplicationDbContext() : base("DefaultConnection", throwIfV1Schema: false) { } public static ApplicationDbContext Create() { return new ApplicationDbContext(); } } } ================================================ FILE: Chapters/DevEnv/Dependency/Game/WebApplication/Models/ManageViewModels.cs ================================================ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using Microsoft.AspNet.Identity; using Microsoft.Owin.Security; namespace WebApplication.Models { public class IndexViewModel { public bool HasPassword { get; set; } public IList Logins { get; set; } public string PhoneNumber { get; set; } public bool TwoFactor { get; set; } public bool BrowserRemembered { get; set; } } public class ManageLoginsViewModel { public IList CurrentLogins { get; set; } public IList OtherLogins { get; set; } } public class FactorViewModel { public string Purpose { get; set; } } public class SetPasswordViewModel { [Required] [StringLength(100, ErrorMessage = "{0} の長さは {2} 文字以上である必要があります。", MinimumLength = 6)] [DataType(DataType.Password)] [Display(Name = "新しいパスワード")] public string NewPassword { get; set; } [DataType(DataType.Password)] [Display(Name = "新しいパスワードの確認入力")] [Compare("NewPassword", ErrorMessage = "新しいパスワードと確認のパスワードが一致しません。")] public string ConfirmPassword { get; set; } } public class ChangePasswordViewModel { [Required] [DataType(DataType.Password)] [Display(Name = "現在のパスワード")] public string OldPassword { get; set; } [Required] [StringLength(100, ErrorMessage = "{0} の長さは {2} 文字以上である必要があります。", MinimumLength = 6)] [DataType(DataType.Password)] [Display(Name = "新しいパスワード")] public string NewPassword { get; set; } [DataType(DataType.Password)] [Display(Name = "新しいパスワードの確認入力")] [Compare("NewPassword", ErrorMessage = "新しいパスワードと確認のパスワードが一致しません。")] public string ConfirmPassword { get; set; } } public class AddPhoneNumberViewModel { [Required] [Phone] [Display(Name = "電話番号")] public string Number { get; set; } } public class VerifyPhoneNumberViewModel { [Required] [Display(Name = "コード")] public string Code { get; set; } [Required] [Phone] [Display(Name = "電話番号")] public string PhoneNumber { get; set; } } public class ConfigureTwoFactorViewModel { public string SelectedProvider { get; set; } public ICollection Providers { get; set; } } } ================================================ FILE: Chapters/DevEnv/Dependency/Game/WebApplication/Project_Readme.html ================================================  ユーザーの ASP.NET アプリケーション ================================================ FILE: Chapters/DevEnv/Dependency/Game/WebApplication/Properties/AssemblyInfo.cs ================================================ using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // アセンブリに関する一般的情報は、以下の属性セットによって // 制御されます。アセンブリに関連付けられている情報を変更するには、 // これらの属性値を変更します。 [assembly: AssemblyTitle("WebApplication")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("WebApplication")] [assembly: AssemblyCopyright("Copyright © 2015")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // ComVisible を false に設定すると、このアセンブリ内の型は // COM コンポーネントから参照できなくなります。 // COM からこのアセンブリ内の型にアクセスする必要がある場合は、その型の ComVisible 属性を true に設定してください。 [assembly: ComVisible(false)] // このプロジェクトが COM に公開される場合、次の GUID が typelib の ID になります。 [assembly: Guid("aacc72b1-f27f-4959-bd3c-0a0528dcc560")] // アセンブリのバージョン情報は、以下の 4 つの値で構成されています: // // メジャー バージョン // マイナー バージョン // ビルド番号 // リビジョン // // すべての値を指定するか、以下のように "*" を使用してリビジョンとビルド番号を // 既定値にすることができます: [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] ================================================ FILE: Chapters/DevEnv/Dependency/Game/WebApplication/Scripts/bootstrap.js ================================================ /* NUGET: BEGIN LICENSE TEXT * * Microsoft grants you the right to use these script files for the sole * purpose of either: (i) interacting through your browser with the Microsoft * website or online service, subject to the applicable licensing or use * terms; or (ii) using the files as included with a Microsoft product subject * to that product's license terms. Microsoft reserves all other rights to the * files not expressly granted by Microsoft, whether by implication, estoppel * or otherwise. Insofar as a script file is dual licensed under GPL, * Microsoft neither took the code under GPL nor distributes it thereunder but * under the terms set out in this paragraph. All notices and licenses * below are for informational purposes only. * * NUGET: END LICENSE TEXT */ /** * bootstrap.js v3.0.0 by @fat and @mdo * Copyright 2013 Twitter Inc. * http://www.apache.org/licenses/LICENSE-2.0 */ if (!jQuery) { throw new Error("Bootstrap requires jQuery") } /* ======================================================================== * Bootstrap: transition.js v3.0.0 * http://twbs.github.com/bootstrap/javascript.html#transitions * ======================================================================== * Copyright 2013 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ======================================================================== */ +function ($) { "use strict"; // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) // ============================================================ function transitionEnd() { var el = document.createElement('bootstrap') var transEndEventNames = { 'WebkitTransition' : 'webkitTransitionEnd' , 'MozTransition' : 'transitionend' , 'OTransition' : 'oTransitionEnd otransitionend' , 'transition' : 'transitionend' } for (var name in transEndEventNames) { if (el.style[name] !== undefined) { return { end: transEndEventNames[name] } } } } // http://blog.alexmaccaw.com/css-transitions $.fn.emulateTransitionEnd = function (duration) { var called = false, $el = this $(this).one($.support.transition.end, function () { called = true }) var callback = function () { if (!called) $($el).trigger($.support.transition.end) } setTimeout(callback, duration) return this } $(function () { $.support.transition = transitionEnd() }) }(window.jQuery); /* ======================================================================== * Bootstrap: alert.js v3.0.0 * http://twbs.github.com/bootstrap/javascript.html#alerts * ======================================================================== * Copyright 2013 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ======================================================================== */ +function ($) { "use strict"; // ALERT CLASS DEFINITION // ====================== var dismiss = '[data-dismiss="alert"]' var Alert = function (el) { $(el).on('click', dismiss, this.close) } Alert.prototype.close = function (e) { var $this = $(this) var selector = $this.attr('data-target') if (!selector) { selector = $this.attr('href') selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 } var $parent = $(selector) if (e) e.preventDefault() if (!$parent.length) { $parent = $this.hasClass('alert') ? $this : $this.parent() } $parent.trigger(e = $.Event('close.bs.alert')) if (e.isDefaultPrevented()) return $parent.removeClass('in') function removeElement() { $parent.trigger('closed.bs.alert').remove() } $.support.transition && $parent.hasClass('fade') ? $parent .one($.support.transition.end, removeElement) .emulateTransitionEnd(150) : removeElement() } // ALERT PLUGIN DEFINITION // ======================= var old = $.fn.alert $.fn.alert = function (option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.alert') if (!data) $this.data('bs.alert', (data = new Alert(this))) if (typeof option == 'string') data[option].call($this) }) } $.fn.alert.Constructor = Alert // ALERT NO CONFLICT // ================= $.fn.alert.noConflict = function () { $.fn.alert = old return this } // ALERT DATA-API // ============== $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) }(window.jQuery); /* ======================================================================== * Bootstrap: button.js v3.0.0 * http://twbs.github.com/bootstrap/javascript.html#buttons * ======================================================================== * Copyright 2013 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ======================================================================== */ +function ($) { "use strict"; // BUTTON PUBLIC CLASS DEFINITION // ============================== var Button = function (element, options) { this.$element = $(element) this.options = $.extend({}, Button.DEFAULTS, options) } Button.DEFAULTS = { loadingText: 'loading...' } Button.prototype.setState = function (state) { var d = 'disabled' var $el = this.$element var val = $el.is('input') ? 'val' : 'html' var data = $el.data() state = state + 'Text' if (!data.resetText) $el.data('resetText', $el[val]()) $el[val](data[state] || this.options[state]) // push to event loop to allow forms to submit setTimeout(function () { state == 'loadingText' ? $el.addClass(d).attr(d, d) : $el.removeClass(d).removeAttr(d); }, 0) } Button.prototype.toggle = function () { var $parent = this.$element.closest('[data-toggle="buttons"]') if ($parent.length) { var $input = this.$element.find('input') .prop('checked', !this.$element.hasClass('active')) .trigger('change') if ($input.prop('type') === 'radio') $parent.find('.active').removeClass('active') } this.$element.toggleClass('active') } // BUTTON PLUGIN DEFINITION // ======================== var old = $.fn.button $.fn.button = function (option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.button') var options = typeof option == 'object' && option if (!data) $this.data('bs.button', (data = new Button(this, options))) if (option == 'toggle') data.toggle() else if (option) data.setState(option) }) } $.fn.button.Constructor = Button // BUTTON NO CONFLICT // ================== $.fn.button.noConflict = function () { $.fn.button = old return this } // BUTTON DATA-API // =============== $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) { var $btn = $(e.target) if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') $btn.button('toggle') e.preventDefault() }) }(window.jQuery); /* ======================================================================== * Bootstrap: carousel.js v3.0.0 * http://twbs.github.com/bootstrap/javascript.html#carousel * ======================================================================== * Copyright 2012 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ======================================================================== */ +function ($) { "use strict"; // CAROUSEL CLASS DEFINITION // ========================= var Carousel = function (element, options) { this.$element = $(element) this.$indicators = this.$element.find('.carousel-indicators') this.options = options this.paused = this.sliding = this.interval = this.$active = this.$items = null this.options.pause == 'hover' && this.$element .on('mouseenter', $.proxy(this.pause, this)) .on('mouseleave', $.proxy(this.cycle, this)) } Carousel.DEFAULTS = { interval: 5000 , pause: 'hover' , wrap: true } Carousel.prototype.cycle = function (e) { e || (this.paused = false) this.interval && clearInterval(this.interval) this.options.interval && !this.paused && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) return this } Carousel.prototype.getActiveIndex = function () { this.$active = this.$element.find('.item.active') this.$items = this.$active.parent().children() return this.$items.index(this.$active) } Carousel.prototype.to = function (pos) { var that = this var activeIndex = this.getActiveIndex() if (pos > (this.$items.length - 1) || pos < 0) return if (this.sliding) return this.$element.one('slid', function () { that.to(pos) }) if (activeIndex == pos) return this.pause().cycle() return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) } Carousel.prototype.pause = function (e) { e || (this.paused = true) if (this.$element.find('.next, .prev').length && $.support.transition.end) { this.$element.trigger($.support.transition.end) this.cycle(true) } this.interval = clearInterval(this.interval) return this } Carousel.prototype.next = function () { if (this.sliding) return return this.slide('next') } Carousel.prototype.prev = function () { if (this.sliding) return return this.slide('prev') } Carousel.prototype.slide = function (type, next) { var $active = this.$element.find('.item.active') var $next = next || $active[type]() var isCycling = this.interval var direction = type == 'next' ? 'left' : 'right' var fallback = type == 'next' ? 'first' : 'last' var that = this if (!$next.length) { if (!this.options.wrap) return $next = this.$element.find('.item')[fallback]() } this.sliding = true isCycling && this.pause() var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction }) if ($next.hasClass('active')) return if (this.$indicators.length) { this.$indicators.find('.active').removeClass('active') this.$element.one('slid', function () { var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) $nextIndicator && $nextIndicator.addClass('active') }) } if ($.support.transition && this.$element.hasClass('slide')) { this.$element.trigger(e) if (e.isDefaultPrevented()) return $next.addClass(type) $next[0].offsetWidth // force reflow $active.addClass(direction) $next.addClass(direction) $active .one($.support.transition.end, function () { $next.removeClass([type, direction].join(' ')).addClass('active') $active.removeClass(['active', direction].join(' ')) that.sliding = false setTimeout(function () { that.$element.trigger('slid') }, 0) }) .emulateTransitionEnd(600) } else { this.$element.trigger(e) if (e.isDefaultPrevented()) return $active.removeClass('active') $next.addClass('active') this.sliding = false this.$element.trigger('slid') } isCycling && this.cycle() return this } // CAROUSEL PLUGIN DEFINITION // ========================== var old = $.fn.carousel $.fn.carousel = function (option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.carousel') var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) var action = typeof option == 'string' ? option : options.slide if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) if (typeof option == 'number') data.to(option) else if (action) data[action]() else if (options.interval) data.pause().cycle() }) } $.fn.carousel.Constructor = Carousel // CAROUSEL NO CONFLICT // ==================== $.fn.carousel.noConflict = function () { $.fn.carousel = old return this } // CAROUSEL DATA-API // ================= $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { var $this = $(this), href var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 var options = $.extend({}, $target.data(), $this.data()) var slideIndex = $this.attr('data-slide-to') if (slideIndex) options.interval = false $target.carousel(options) if (slideIndex = $this.attr('data-slide-to')) { $target.data('bs.carousel').to(slideIndex) } e.preventDefault() }) $(window).on('load', function () { $('[data-ride="carousel"]').each(function () { var $carousel = $(this) $carousel.carousel($carousel.data()) }) }) }(window.jQuery); /* ======================================================================== * Bootstrap: collapse.js v3.0.0 * http://twbs.github.com/bootstrap/javascript.html#collapse * ======================================================================== * Copyright 2012 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ======================================================================== */ +function ($) { "use strict"; // COLLAPSE PUBLIC CLASS DEFINITION // ================================ var Collapse = function (element, options) { this.$element = $(element) this.options = $.extend({}, Collapse.DEFAULTS, options) this.transitioning = null if (this.options.parent) this.$parent = $(this.options.parent) if (this.options.toggle) this.toggle() } Collapse.DEFAULTS = { toggle: true } Collapse.prototype.dimension = function () { var hasWidth = this.$element.hasClass('width') return hasWidth ? 'width' : 'height' } Collapse.prototype.show = function () { if (this.transitioning || this.$element.hasClass('in')) return var startEvent = $.Event('show.bs.collapse') this.$element.trigger(startEvent) if (startEvent.isDefaultPrevented()) return var actives = this.$parent && this.$parent.find('> .panel > .in') if (actives && actives.length) { var hasData = actives.data('bs.collapse') if (hasData && hasData.transitioning) return actives.collapse('hide') hasData || actives.data('bs.collapse', null) } var dimension = this.dimension() this.$element .removeClass('collapse') .addClass('collapsing') [dimension](0) this.transitioning = 1 var complete = function () { this.$element .removeClass('collapsing') .addClass('in') [dimension]('auto') this.transitioning = 0 this.$element.trigger('shown.bs.collapse') } if (!$.support.transition) return complete.call(this) var scrollSize = $.camelCase(['scroll', dimension].join('-')) this.$element .one($.support.transition.end, $.proxy(complete, this)) .emulateTransitionEnd(350) [dimension](this.$element[0][scrollSize]) } Collapse.prototype.hide = function () { if (this.transitioning || !this.$element.hasClass('in')) return var startEvent = $.Event('hide.bs.collapse') this.$element.trigger(startEvent) if (startEvent.isDefaultPrevented()) return var dimension = this.dimension() this.$element [dimension](this.$element[dimension]()) [0].offsetHeight this.$element .addClass('collapsing') .removeClass('collapse') .removeClass('in') this.transitioning = 1 var complete = function () { this.transitioning = 0 this.$element .trigger('hidden.bs.collapse') .removeClass('collapsing') .addClass('collapse') } if (!$.support.transition) return complete.call(this) this.$element [dimension](0) .one($.support.transition.end, $.proxy(complete, this)) .emulateTransitionEnd(350) } Collapse.prototype.toggle = function () { this[this.$element.hasClass('in') ? 'hide' : 'show']() } // COLLAPSE PLUGIN DEFINITION // ========================== var old = $.fn.collapse $.fn.collapse = function (option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.collapse') var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) if (typeof option == 'string') data[option]() }) } $.fn.collapse.Constructor = Collapse // COLLAPSE NO CONFLICT // ==================== $.fn.collapse.noConflict = function () { $.fn.collapse = old return this } // COLLAPSE DATA-API // ================= $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) { var $this = $(this), href var target = $this.attr('data-target') || e.preventDefault() || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 var $target = $(target) var data = $target.data('bs.collapse') var option = data ? 'toggle' : $this.data() var parent = $this.attr('data-parent') var $parent = parent && $(parent) if (!data || !data.transitioning) { if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed') $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed') } $target.collapse(option) }) }(window.jQuery); /* ======================================================================== * Bootstrap: dropdown.js v3.0.0 * http://twbs.github.com/bootstrap/javascript.html#dropdowns * ======================================================================== * Copyright 2012 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ======================================================================== */ +function ($) { "use strict"; // DROPDOWN CLASS DEFINITION // ========================= var backdrop = '.dropdown-backdrop' var toggle = '[data-toggle=dropdown]' var Dropdown = function (element) { var $el = $(element).on('click.bs.dropdown', this.toggle) } Dropdown.prototype.toggle = function (e) { var $this = $(this) if ($this.is('.disabled, :disabled')) return var $parent = getParent($this) var isActive = $parent.hasClass('open') clearMenus() if (!isActive) { if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { // if mobile we we use a backdrop because click events don't delegate $('